La catena multi-baseline: superficie reale ricostruita dagli SLC, nuvola tomografica e attributi di micro-moto. Metodo di Biondi e Malanga, implementato e verificato riga per riga.
Stack interferometrico multi-baseline sul canale VH: lettura degli SLC, deramping TOPS, coregistrazione scelta massimizzando la coerenza e non il picco della cross-correlazione, fase geometrica di riferimento calcolata da orbite e geolocation grid, e inversione in quota con un periodogramma per pixel — il numero d’onda verticale cambia da cella a cella, quindi non esiste una sola matrice di steering.
La soglia di qualita’ non e’ scelta a mano: viene dalla distribuzione nulla del periodogramma, stimata per Monte Carlo con le baseline vere. Con undici fasori casuali il picco normalizzato ha gia’ mediana 0,56: qualunque soglia piu’ bassa accetterebbe rumore puro e lo farebbe sembrare una misura.
| acquisizioni impilate | 43 |
| master | 20260503 |
| polarizzazione | VH |
| escursione delle baseline | 297.1 m |
| risoluzione verticale δz | 132 m |
| precisione sulla quota σh | 8.3 m |
| coerenza mediana misurata | 0.419 |
| soglia di qualita' dalla distribuzione nulla | 0.431 |
La superficie della piana si ricostruisce con precisione metrica. Le piramidi no. Le facce a ~52° superano l’angolo di incidenza di 37°: sono in layover pieno, con centinaia di punti di superficie ripiegati nella stessa cella di risoluzione. Il piano dei diffusori dominanti sta appena sopra il deserto e non segue il profilo delle facce.


I riassunti della corsa sono dentro questa pagina, non in file da scaricare a parte: sono gli stessi da cui vengono i numeri della tabella qui sopra.
{
"generato": "2026-09-07 10:16:07",
"programma": "piramidi_v02.py (revisione 2026-08-28)",
"metodo": "stack interferometrico multi-baseline VH + periodogramma in quota + attributi di micro-moto Doppler",
"polarizzazione": "VH (cross-pol, scattering di volume)",
"sorgente_geometria": "annotation.xml (orbite, geolocation grid, quota di riferimento)",
"sorgente_misura": "tiff VH, pixel per pixel",
"date": [
"20260103",
"20260109",
"20260115",
"20260121",
"20260127",
"20260202",
"20260208",
"20260214",
"20260220",
"20260226",
"20260304",
"20260310",
"20260316",
"20260322",
"20260328",
"20260403",
"20260409",
"20260415",
"20260421",
"20260427",
"20260428",
"20260503",
"20260509",
"20260521",
"20260522",
"20260527",
"20260602",
"20260603",
"20260608",
"20260615",
"20260620",
"20260627",
"20260703",
"20260709",
"20260715",
"20260721",
"20260727",
"20260802",
"20260808",
"20260814",
"20260820",
"20260826",
"20260901"
],
"master": "20260503",
"coregistrazione": [
{
"data": "20260103",
"b_perp_m": 0.06,
"b_temp_giorni": -120.0,
"shift_px": [
0.774,
-0.256
],
"shift_geo_px": [
-0.101,
-0.256
],
"shift_corr_px": [
-1.1,
-0.1
],
"coerenza_geo": 0.2773,
"coerenza_corr": 0.1867,
"coerenza_finale": 0.3462,
"offset_finestra_px": [
0,
33
],
"burst": 2,
"sorgente_shift": "coer",
"psr": 12.88
},
{
"data": "20260109",
"b_perp_m": -124.74,
"b_temp_giorni": -114.0,
"shift_px": [
0.455,
-0.005
],
"shift_geo_px": [
0.455,
-0.005
],
"shift_corr_px": [
-17.25,
-0.05
],
"coerenza_geo": 0.1863,
"coerenza_corr": null,
"coerenza_finale": 0.1863,
"offset_finestra_px": [
4508,
106
],
"burst": 5,
"sorgente_shift": "geo",
"psr": 9.98
},
{
"data": "20260115",
"b_perp_m": -38.53,
"b_temp_giorni": -108.0,
"shift_px": [
1.553,
0.091
],
"shift_geo_px": [
-0.072,
-0.159
],
"shift_corr_px": [
-40.35,
-0.05
],
"coerenza_geo": 0.1986,
"coerenza_corr": null,
"coerenza_finale": 0.3215,
"offset_finestra_px": [
2,
42
],
"burst": 2,
"sorgente_shift": "coer",
"psr": 8.52
},
{
"data": "20260121",
"b_perp_m": -47.68,
"b_temp_giorni": -102.0,
"shift_px": [
3.203,
1.933
],
"shift_geo_px": [
0.453,
0.433
],
"shift_corr_px": [
5.55,
-0.95
],
"coerenza_geo": 0.1792,
"coerenza_corr": null,
"coerenza_finale": 0.1928,
"offset_finestra_px": [
4509,
76
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 11.19
},
{
"data": "20260127",
"b_perp_m": -139.67,
"b_temp_giorni": -96.0,
"shift_px": [
1.29,
-0.073
],
"shift_geo_px": [
-0.21,
0.052
],
"shift_corr_px": [
11.05,
-1.1
],
"coerenza_geo": 0.2137,
"coerenza_corr": null,
"coerenza_finale": 0.3295,
"offset_finestra_px": [
-5,
70
],
"burst": 2,
"sorgente_shift": "coer",
"psr": 10.03
},
{
"data": "20260202",
"b_perp_m": -23.71,
"b_temp_giorni": -90.0,
"shift_px": [
-1.545,
2.55
],
"shift_geo_px": [
-0.295,
-0.2
],
"shift_corr_px": [
-13.6,
-0.0
],
"coerenza_geo": 0.1803,
"coerenza_corr": null,
"coerenza_finale": 0.1906,
"offset_finestra_px": [
4510,
58
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 10.74
},
{
"data": "20260208",
"b_perp_m": -152.61,
"b_temp_giorni": -84.0,
"shift_px": [
-0.162,
0.174
],
"shift_geo_px": [
-0.162,
0.174
],
"shift_corr_px": [
-0.0,
-0.05
],
"coerenza_geo": 0.3341,
"coerenza_corr": 0.3381,
"coerenza_finale": 0.3341,
"offset_finestra_px": [
-1,
68
],
"burst": 2,
"sorgente_shift": "geo",
"psr": 17.18
},
{
"data": "20260214",
"b_perp_m": -84.2,
"b_temp_giorni": -78.0,
"shift_px": [
0.157,
-0.09
],
"shift_geo_px": [
0.157,
-0.09
],
"shift_corr_px": [
40.25,
-1.1
],
"coerenza_geo": 0.1809,
"coerenza_corr": null,
"coerenza_finale": 0.1809,
"offset_finestra_px": [
4509,
83
],
"burst": 5,
"sorgente_shift": "geo",
"psr": 12.19
},
{
"data": "20260220",
"b_perp_m": -100.9,
"b_temp_giorni": -72.0,
"shift_px": [
-1.112,
-0.47
],
"shift_geo_px": [
-0.487,
-0.345
],
"shift_corr_px": [
-0.05,
2.2
],
"coerenza_geo": 0.2611,
"coerenza_corr": 0.1831,
"coerenza_finale": 0.2826,
"offset_finestra_px": [
6,
47
],
"burst": 2,
"sorgente_shift": "coer",
"psr": 12.03
},
{
"data": "20260226",
"b_perp_m": -138.77,
"b_temp_giorni": -66.0,
"shift_px": [
3.126,
-0.358
],
"shift_geo_px": [
0.376,
-0.233
],
"shift_corr_px": [
4.15,
-0.15
],
"coerenza_geo": 0.183,
"coerenza_corr": null,
"coerenza_finale": 0.2452,
"offset_finestra_px": [
4509,
93
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 12.88
},
{
"data": "20260304",
"b_perp_m": -60.89,
"b_temp_giorni": -60.0,
"shift_px": [
-0.423,
0.447
],
"shift_geo_px": [
-0.423,
0.447
],
"shift_corr_px": [
1.15,
-0.15
],
"coerenza_geo": 0.2849,
"coerenza_corr": 0.2051,
"coerenza_finale": 0.2849,
"offset_finestra_px": [
6,
35
],
"burst": 2,
"sorgente_shift": "geo",
"psr": 13.77
},
{
"data": "20260310",
"b_perp_m": -186.24,
"b_temp_giorni": -54.0,
"shift_px": [
-2.458,
-1.959
],
"shift_geo_px": [
-0.083,
0.416
],
"shift_corr_px": [
-40.9,
0.05
],
"coerenza_geo": 0.1783,
"coerenza_corr": null,
"coerenza_finale": 0.1906,
"offset_finestra_px": [
4509,
104
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 9.81
},
{
"data": "20260316",
"b_perp_m": -109.31,
"b_temp_giorni": -48.0,
"shift_px": [
1.318,
-0.27
],
"shift_geo_px": [
0.318,
-0.27
],
"shift_corr_px": [
2.1,
2.15
],
"coerenza_geo": 0.2147,
"coerenza_corr": null,
"coerenza_finale": 0.2451,
"offset_finestra_px": [
7,
45
],
"burst": 2,
"sorgente_shift": "coer",
"psr": 10.3
},
{
"data": "20260322",
"b_perp_m": -146.47,
"b_temp_giorni": -42.0,
"shift_px": [
2.935,
2.262
],
"shift_geo_px": [
0.185,
0.137
],
"shift_corr_px": [
4.9,
0.05
],
"coerenza_geo": 0.1794,
"coerenza_corr": null,
"coerenza_finale": 0.1929,
"offset_finestra_px": [
4511,
96
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 10.93
},
{
"data": "20260328",
"b_perp_m": -101.53,
"b_temp_giorni": -36.0,
"shift_px": [
0.452,
-0.267
],
"shift_geo_px": [
0.452,
-0.267
],
"shift_corr_px": [
11.3,
-0.0
],
"coerenza_geo": 0.2562,
"coerenza_corr": null,
"coerenza_finale": 0.2562,
"offset_finestra_px": [
7,
43
],
"burst": 2,
"sorgente_shift": "geo",
"psr": 9.21
},
{
"data": "20260403",
"b_perp_m": -83.54,
"b_temp_giorni": -30.0,
"shift_px": [
0.09,
-0.006
],
"shift_geo_px": [
0.09,
-0.006
],
"shift_corr_px": [
1.15,
-1.05
],
"coerenza_geo": 0.178,
"coerenza_corr": 0.1762,
"coerenza_finale": 0.178,
"offset_finestra_px": [
4511,
77
],
"burst": 5,
"sorgente_shift": "geo",
"psr": 12.44
},
{
"data": "20260409",
"b_perp_m": -115.25,
"b_temp_giorni": -24.0,
"shift_px": [
1.601,
-0.227
],
"shift_geo_px": [
0.226,
-0.102
],
"shift_corr_px": [
-32.4,
-0.0
],
"coerenza_geo": 0.213,
"coerenza_corr": null,
"coerenza_finale": 0.2979,
"offset_finestra_px": [
4,
49
],
"burst": 2,
"sorgente_shift": "coer",
"psr": 10.6
},
{
"data": "20260415",
"b_perp_m": -163.95,
"b_temp_giorni": -18.0,
"shift_px": [
2.795,
1.621
],
"shift_geo_px": [
0.045,
-0.004
],
"shift_corr_px": [
-1.15,
83.9
],
"coerenza_geo": 0.179,
"coerenza_corr": null,
"coerenza_finale": 0.1939,
"offset_finestra_px": [
4511,
100
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 9.7
},
{
"data": "20260421",
"b_perp_m": -143.85,
"b_temp_giorni": -12.0,
"shift_px": [
0.854,
-0.371
],
"shift_geo_px": [
0.229,
-0.246
],
"shift_corr_px": [
1.85,
-0.0
],
"coerenza_geo": 0.2112,
"coerenza_corr": 0.1991,
"coerenza_finale": 0.2248,
"offset_finestra_px": [
10,
41
],
"burst": 2,
"sorgente_shift": "coer",
"psr": 10.72
},
{
"data": "20260427",
"b_perp_m": -113.31,
"b_temp_giorni": -6.0,
"shift_px": [
2.313,
2.182
],
"shift_geo_px": [
-0.437,
-0.193
],
"shift_corr_px": [
-5.25,
-1.05
],
"coerenza_geo": 0.1748,
"coerenza_corr": null,
"coerenza_finale": 0.1877,
"offset_finestra_px": [
4513,
67
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 8.75
},
{
"data": "20260428",
"b_perp_m": -85.18,
"b_temp_giorni": -5.0,
"shift_px": [
0.206,
-0.307
],
"shift_geo_px": [
0.206,
-0.307
],
"shift_corr_px": [
1.2,
-0.05
],
"coerenza_geo": 0.3707,
"coerenza_corr": 0.2954,
"coerenza_finale": 0.3707,
"offset_finestra_px": [
4542,
58
],
"burst": 5,
"sorgente_shift": "geo",
"psr": 13.84
},
{
"data": "20260503",
"b_perp_m": 0.0,
"b_temp_giorni": 0.0,
"shift_px": [
0.0,
0.0
],
"shift_geo_px": [
0.0,
0.0
],
"shift_corr_px": [
0.0,
0.0
],
"coerenza_geo": null,
"coerenza_corr": null,
"coerenza_finale": null,
"offset_finestra_px": [
0,
0
],
"burst": 2,
"sorgente_shift": "master",
"psr": null
},
{
"data": "20260509",
"b_perp_m": -176.69,
"b_temp_giorni": 6.0,
"shift_px": [
-0.346,
-0.25
],
"shift_geo_px": [
-0.346,
-0.25
],
"shift_corr_px": [
-2.3,
-1.1
],
"coerenza_geo": 0.1777,
"coerenza_corr": 0.1784,
"coerenza_finale": 0.1777,
"offset_finestra_px": [
4513,
87
],
"burst": 5,
"sorgente_shift": "geo",
"psr": 10.86
},
{
"data": "20260521",
"b_perp_m": -130.26,
"b_temp_giorni": 18.0,
"shift_px": [
1.101,
0.345
],
"shift_geo_px": [
0.476,
0.47
],
"shift_corr_px": [
35.05,
-0.05
],
"coerenza_geo": 0.3507,
"coerenza_corr": null,
"coerenza_finale": 0.3989,
"offset_finestra_px": [
4538,
81
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 10.89
},
{
"data": "20260522",
"b_perp_m": -142.62,
"b_temp_giorni": 19.0,
"shift_px": [
0.37,
0.333
],
"shift_geo_px": [
0.37,
0.333
],
"shift_corr_px": [
1.1,
1.25
],
"coerenza_geo": 0.3201,
"coerenza_corr": 0.2255,
"coerenza_finale": 0.3201,
"offset_finestra_px": [
4541,
82
],
"burst": 5,
"sorgente_shift": "geo",
"psr": 10.23
},
{
"data": "20260527",
"b_perp_m": 86.65,
"b_temp_giorni": 24.0,
"shift_px": [
0.31,
-0.321
],
"shift_geo_px": [
-0.315,
-0.321
],
"shift_corr_px": [
1.1,
-0.05
],
"coerenza_geo": 0.3674,
"coerenza_corr": 0.3236,
"coerenza_finale": 0.4111,
"offset_finestra_px": [
3,
-12
],
"burst": 2,
"sorgente_shift": "coer",
"psr": 14.45
},
{
"data": "20260602",
"b_perp_m": -64.63,
"b_temp_giorni": 30.0,
"shift_px": [
1.436,
-0.358
],
"shift_geo_px": [
0.061,
-0.358
],
"shift_corr_px": [
-29.25,
-1.05
],
"coerenza_geo": 0.2274,
"coerenza_corr": null,
"coerenza_finale": 0.3571,
"offset_finestra_px": [
4540,
58
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 9.57
},
{
"data": "20260603",
"b_perp_m": -116.35,
"b_temp_giorni": 31.0,
"shift_px": [
-0.114,
-0.154
],
"shift_geo_px": [
-0.114,
-0.154
],
"shift_corr_px": [
1.15,
-0.85
],
"coerenza_geo": 0.2954,
"coerenza_corr": 0.2096,
"coerenza_finale": 0.2954,
"offset_finestra_px": [
4543,
69
],
"burst": 5,
"sorgente_shift": "geo",
"psr": 11.28
},
{
"data": "20260608",
"b_perp_m": 28.79,
"b_temp_giorni": 36.0,
"shift_px": [
0.42,
-0.071
],
"shift_geo_px": [
-0.08,
-0.071
],
"shift_corr_px": [
-1.05,
-0.15
],
"coerenza_geo": 0.3701,
"coerenza_corr": 0.2281,
"coerenza_finale": 0.3969,
"offset_finestra_px": [
4,
1
],
"burst": 2,
"sorgente_shift": "coer",
"psr": 12.42
},
{
"data": "20260615",
"b_perp_m": -102.73,
"b_temp_giorni": 43.0,
"shift_px": [
0.076,
0.271
],
"shift_geo_px": [
0.076,
0.271
],
"shift_corr_px": [
22.2,
-0.05
],
"coerenza_geo": 0.3107,
"coerenza_corr": null,
"coerenza_finale": 0.3107,
"offset_finestra_px": [
4542,
71
],
"burst": 5,
"sorgente_shift": "geo",
"psr": 11.91
},
{
"data": "20260620",
"b_perp_m": 5.23,
"b_temp_giorni": 48.0,
"shift_px": [
0.53,
-0.042
],
"shift_geo_px": [
-0.095,
0.083
],
"shift_corr_px": [
-21.35,
0.05
],
"coerenza_geo": 0.3518,
"coerenza_corr": null,
"coerenza_finale": 0.4044,
"offset_finestra_px": [
2,
1
],
"burst": 2,
"sorgente_shift": "coer",
"psr": 10.19
},
{
"data": "20260627",
"b_perp_m": -166.94,
"b_temp_giorni": 55.0,
"shift_px": [
0.401,
-0.171
],
"shift_geo_px": [
0.401,
-0.171
],
"shift_corr_px": [
7.0,
0.05
],
"coerenza_geo": 0.1797,
"coerenza_corr": null,
"coerenza_finale": 0.1797,
"offset_finestra_px": [
10429,
-126
],
"burst": 9,
"sorgente_shift": "geo",
"psr": 10.02
},
{
"data": "20260703",
"b_perp_m": -153.95,
"b_temp_giorni": 61.0,
"shift_px": [
1.24,
-0.047
],
"shift_geo_px": [
-0.385,
-0.047
],
"shift_corr_px": [
29.9,
1.15
],
"coerenza_geo": 0.2038,
"coerenza_corr": null,
"coerenza_finale": 0.319,
"offset_finestra_px": [
4539,
87
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 10.11
},
{
"data": "20260709",
"b_perp_m": -184.01,
"b_temp_giorni": 67.0,
"shift_px": [
1.295,
-0.498
],
"shift_geo_px": [
-0.08,
-0.373
],
"shift_corr_px": [
-11.05,
-0.0
],
"coerenza_geo": 0.205,
"coerenza_corr": null,
"coerenza_finale": 0.2633,
"offset_finestra_px": [
4540,
-24
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 11.47
},
{
"data": "20260715",
"b_perp_m": -113.0,
"b_temp_giorni": 73.0,
"shift_px": [
1.346,
-0.396
],
"shift_geo_px": [
-0.404,
-0.396
],
"shift_corr_px": [
-0.05,
0.15
],
"coerenza_geo": 0.1971,
"coerenza_corr": 0.2134,
"coerenza_finale": 0.3658,
"offset_finestra_px": [
4537,
66
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 12.94
},
{
"data": "20260721",
"b_perp_m": -210.46,
"b_temp_giorni": 79.0,
"shift_px": [
0.218,
-0.11
],
"shift_geo_px": [
0.218,
-0.11
],
"shift_corr_px": [
12.8,
-0.05
],
"coerenza_geo": 0.2547,
"coerenza_corr": null,
"coerenza_finale": 0.2547,
"offset_finestra_px": [
4540,
-25
],
"burst": 5,
"sorgente_shift": "geo",
"psr": 11.06
},
{
"data": "20260727",
"b_perp_m": -131.8,
"b_temp_giorni": 85.0,
"shift_px": [
0.929,
-0.174
],
"shift_geo_px": [
0.179,
-0.049
],
"shift_corr_px": [
0.2,
-1.1
],
"coerenza_geo": 0.2827,
"coerenza_corr": 0.2244,
"coerenza_finale": 0.3315,
"offset_finestra_px": [
4537,
76
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 10.35
},
{
"data": "20260802",
"b_perp_m": -142.62,
"b_temp_giorni": 91.0,
"shift_px": [
1.76,
0.47
],
"shift_geo_px": [
0.385,
0.47
],
"shift_corr_px": [
-38.2,
-0.0
],
"coerenza_geo": 0.2032,
"coerenza_corr": null,
"coerenza_finale": 0.251,
"offset_finestra_px": [
4540,
-42
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 10.13
},
{
"data": "20260808",
"b_perp_m": -148.42,
"b_temp_giorni": 97.0,
"shift_px": [
0.559,
-0.008
],
"shift_geo_px": [
-0.316,
-0.008
],
"shift_corr_px": [
0.1,
-2.15
],
"coerenza_geo": 0.2798,
"coerenza_corr": 0.1961,
"coerenza_finale": 0.3362,
"offset_finestra_px": [
4537,
80
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 11.53
},
{
"data": "20260814",
"b_perp_m": -97.71,
"b_temp_giorni": 103.0,
"shift_px": [
1.006,
-0.063
],
"shift_geo_px": [
-0.369,
0.062
],
"shift_corr_px": [
1.0,
-1.1
],
"coerenza_geo": 0.2077,
"coerenza_corr": 0.2129,
"coerenza_finale": 0.2652,
"offset_finestra_px": [
4541,
-54
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 11.72
},
{
"data": "20260820",
"b_perp_m": -187.45,
"b_temp_giorni": 109.0,
"shift_px": [
0.784,
-0.001
],
"shift_geo_px": [
-0.466,
-0.001
],
"shift_corr_px": [
-33.85,
0.05
],
"coerenza_geo": 0.2429,
"coerenza_corr": null,
"coerenza_finale": 0.3414,
"offset_finestra_px": [
4534,
88
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 10.94
},
{
"data": "20260826",
"b_perp_m": -118.91,
"b_temp_giorni": 115.0,
"shift_px": [
0.234,
0.471
],
"shift_geo_px": [
-0.391,
0.346
],
"shift_corr_px": [
-0.05,
-1.15
],
"coerenza_geo": 0.27,
"coerenza_corr": 0.2043,
"coerenza_finale": 0.2948,
"offset_finestra_px": [
4539,
-52
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 12.26
},
{
"data": "20260901",
"b_perp_m": -129.12,
"b_temp_giorni": 121.0,
"shift_px": [
1.597,
-0.425
],
"shift_geo_px": [
0.472,
-0.3
],
"shift_corr_px": [
-43.2,
-1.1
],
"coerenza_geo": 0.2562,
"coerenza_corr": null,
"coerenza_finale": 0.3483,
"offset_finestra_px": [
4534,
74
],
"burst": 5,
"sorgente_shift": "coer",
"psr": 10.64
}
],
"budget": {
"wavelength": 0.05546576,
"slant_range": 850842.1797933187,
"incidence_deg": 36.83484649658203,
"b_spread": 297.10359990481487,
"b_std": 63.4577204828207,
"n_baselines": 43,
"delta_z_slant": 79.42113147974727,
"delta_z_vertical": 132.47663543091855,
"ambiguity_height": 12715.882941661179,
"target_height": 138.5,
"gamma_typ": 0.4193578362464905,
"sigma_h": 8.282142046387673
},
"budget_a_priori": {
"wavelength": 0.05546576,
"slant_range": 850842.1797933187,
"incidence_deg": 36.83484649658203,
"b_spread": 297.10359990481487,
"b_std": 63.4577204828207,
"n_baselines": 43,
"delta_z_slant": 79.42113147974727,
"delta_z_vertical": 132.47663543091855,
"ambiguity_height": 12715.882941661179,
"target_height": 138.5,
"gamma_typ": 0.6,
"sigma_h": 5.101124692796365
},
"coerenza_mediana_misurata": 0.4194,
"soglia_qualita_gamma": 0.4315,
"distribuzione_nulla_periodogramma": {
"mediana_nulla": 0.2903,
"p90_nulla": 0.3615,
"p99_nulla": 0.4315,
"p99_9_nulla": 0.4833,
"soglia_usata": 0.4315,
"percentile_usato": 99.0,
"prove": 20000
},
"nodi_despicati": 463,
"contrasto_per_polarizzazione": {
"vh": {
"data": "20260509",
"fondo_dB": -13.59,
"contrasto_per_fascia_dB": {
"layover_alto_gt80m": 1.7,
"medio_40_80m": 2.56,
"basso_lt40m": -0.93
},
"picco_dB": {
"Cheope (Khufu)": 12.99,
"Chefren (Khafre)": 7.5
}
}
},
"piano_sub_aperture": {
"b_cd": 313.0,
"b_dl": 156.5,
"b_sub": 156.5,
"b_shift": 28.169999999999998,
"step": 11.666363636363638,
"n_d": 12,
"df_bin": 2.1927901996888064,
"bins_per_sub": 71.37025695491067,
"k_a": -2188.2693637370594,
"k_t": 1491.5443452737063,
"t_illum": 0.14303540742601642,
"dt_step": 0.0053313197313333395,
"dt_shift": 0.012873186668341476,
"t_window": 0.058644517044666736,
"f_sample": 187.57081743246047,
"f_max_obs": 38.8404217915701,
"f_min_obs": 17.05189249386004,
"aperture_m": 958.33722975431,
"lambda_sound_m": 154.47824002009773,
"delta_z_acoustic": 68507.46268656716
},
"segno_k_z": -1.0,
"layover": {
"angolo_di_incidenza_deg": 36.83,
"angolo_di_vista_off_nadir_deg": 32.73,
"soglia_layover_deg": 36.83,
"soglia_ombra_deg": 53.17,
"piramidi": [
{
"piramide": "Cheope (Khufu)",
"pendenza_faccia_deg": 51.84,
"incidenza_locale_faccia_vicina_deg": -15.01,
"incidenza_locale_faccia_lontana_deg": 88.67,
"faccia_vicina": "layover",
"faccia_lontana": "illuminata",
"estensione_slant_faccia_vicina_m": 41.8,
"compressione": 2.8
},
{
"piramide": "Chefren (Khafre)",
"pendenza_faccia_deg": 53.13,
"incidenza_locale_faccia_vicina_deg": -16.3,
"incidenza_locale_faccia_lontana_deg": 89.96,
"faccia_vicina": "layover",
"faccia_lontana": "illuminata",
"estensione_slant_faccia_vicina_m": 44.6,
"compressione": 2.4
},
{
"piramide": "Micerino (Menkaure)",
"pendenza_faccia_deg": 51.34,
"incidenza_locale_faccia_vicina_deg": -14.51,
"incidenza_locale_faccia_lontana_deg": 88.17,
"faccia_vicina": "layover",
"faccia_lontana": "illuminata",
"estensione_slant_faccia_vicina_m": 18.2,
"compressione": 2.8
}
],
"nota": "Tutte e tre le facce rivolte al sensore superano l'angolo di incidenza: sono in layover pieno, e le facce opposte sono in ombra. E' geometria, non un artefatto del processing. Le fonti raccomandano di preferire il lato in layover: comprime piu' diffusori nella stessa cella di range ma li separa lungo l'asse di elevazione, che e' esattamente l'asse ricostruito qui."
},
"validazione": {
"livello_1_geometria": {
"regressione_misurato_vs_simulato": {
"pixel": 223,
"pendenza": -0.058,
"pendenza_theil_sen": 0.041,
"ic95": [
0.005,
0.077
],
"mediane_per_fascia": [
{
"simulato_m": [
5,
30
],
"celle": 70,
"misurato_mediano_m": 3.4
},
{
"simulato_m": [
30,
60
],
"celle": 52,
"misurato_mediano_m": 5.3
},
{
"simulato_m": [
60,
90
],
"celle": 60,
"misurato_mediano_m": 5.4
},
{
"simulato_m": [
90,
null
],
"celle": 41,
"misurato_mediano_m": 8.5
}
],
"pendenza_attesa": 1.0,
"errore_standard_pendenza": 0.149,
"t_pendenza": -0.4,
"intercetta_m": -2.9,
"correlazione_r": -0.026,
"rmse_m": 78.4,
"esito": "nessuna dipendenza significativa dalla quota simulata"
},
"Cheope (Khufu)": {
"celle_simulate": 345,
"celle_di_qualita": 90,
"celle_di_sommita": 11,
"rilievo_misurato_m": 9.7,
"rilievo_simulato_m": 108.3,
"errore_m": -98.7,
"entro_2_sigma_h": false,
"rilievo_misurato_alla_base_m": 1.1
},
"Chefren (Khafre)": {
"celle_simulate": 309,
"celle_di_qualita": 135,
"celle_di_sommita": 24,
"rilievo_misurato_m": 8.4,
"rilievo_simulato_m": 113.2,
"errore_m": -104.8,
"entro_2_sigma_h": false,
"rilievo_misurato_alla_base_m": 4.2
},
"Micerino (Menkaure)": {
"celle_simulate": 77,
"celle_di_qualita": 22,
"celle_di_sommita": 3,
"rilievo_misurato_alla_base_m": 1.6
},
"_quota_mediana_piana_m": 65.0,
"_sigma_h_attesa_m": 8.3,
"_soglia_qualita_gamma": 0.432,
"_distribuzione_nulla": {
"mediana_nulla": 0.2903,
"p90_nulla": 0.3615,
"p99_nulla": 0.4315,
"p99_9_nulla": 0.4833,
"soglia_usata": 0.4315,
"percentile_usato": 99.0,
"prove": 20000
},
"_riferimento": "le quote note da letteratura archeologica entrano SOLO nella simulazione di confronto, mai nella catena che produce la superficie misurata"
},
"livello_2_misura": {
"pixel_buoni_frazione": 0.4661,
"gamma_mediana": 0.4178,
"gamma_p90": 0.6888,
"dispersione_quota_sulla_piana_m": 69.2,
"dispersione_robusta_sulla_piana_m": 12.3,
"sigma_h_teorica_m": 8.3,
"nota": "la dispersione ROBUSTA misurata sulla piana e' il controllo empirico della sigma_h teorica: se le due sono dello stesso ordine il budget di precisione e' onesto; la deviazione standard e' riportata per completezza ma e' dominata dalla coda degli errori grossolani (F27)"
},
"livello_3_struttura": {
"layover": {
"angolo_di_incidenza_deg": 36.83,
"angolo_di_vista_off_nadir_deg": 32.73,
"soglia_layover_deg": 36.83,
"soglia_ombra_deg": 53.17,
"piramidi": [
{
"piramide": "Cheope (Khufu)",
"pendenza_faccia_deg": 51.84,
"incidenza_locale_faccia_vicina_deg": -15.01,
"incidenza_locale_faccia_lontana_deg": 88.67,
"faccia_vicina": "layover",
"faccia_lontana": "illuminata",
"estensione_slant_faccia_vicina_m": 41.8,
"compressione": 2.8
},
{
"piramide": "Chefren (Khafre)",
"pendenza_faccia_deg": 53.13,
"incidenza_locale_faccia_vicina_deg": -16.3,
"incidenza_locale_faccia_lontana_deg": 89.96,
"faccia_vicina": "layover",
"faccia_lontana": "illuminata",
"estensione_slant_faccia_vicina_m": 44.6,
"compressione": 2.4
},
{
"piramide": "Micerino (Menkaure)",
"pendenza_faccia_deg": 51.34,
"incidenza_locale_faccia_vicina_deg": -14.51,
"incidenza_locale_faccia_lontana_deg": 88.17,
"faccia_vicina": "layover",
"faccia_lontana": "illuminata",
"estensione_slant_faccia_vicina_m": 18.2,
"compressione": 2.8
}
],
"nota": "Tutte e tre le facce rivolte al sensore superano l'angolo di incidenza: sono in layover pieno, e le facce opposte sono in ombra. E' geometria, non un artefatto del processing. Le fonti raccomandano di preferire il lato in layover: comprime piu' diffusori nella stessa cella di range ma li separa lungo l'asse di elevazione, che e' esattamente l'asse ricostruito qui."
},
"separabilita_piramide_vs_piana": {
"delta_quota_mediana_m": 5.3,
"errore_standard_m": 5.29,
"z_score": 1.0,
"pixel_su_piramide": 236,
"pixel_su_piana": 3665
},
"avvertenza_interna": "delta_z verticale 132 m contro 138 m di altezza: la piramide occupa 1.05 celle di RISOLUZIONE. Nessuna struttura interna e' separabile con questi dati. Le camere note (Grande Galleria, camera del Re, camera della Regina) hanno dimensioni di alcuni metri, due ordini di grandezza sotto."
},
"calibrazione_segno_k_z": {
"segno_+1": {
"quota_mediana_piramidi_m": -8.79,
"quota_mediana_piana_m": -0.95,
"margine_m": -7.85,
"pixel_su_piramide": 73,
"pixel_su_piana": 3275
},
"segno_-1": {
"quota_mediana_piramidi_m": 8.79,
"quota_mediana_piana_m": 0.95,
"margine_m": 7.85,
"pixel_su_piramide": 73,
"pixel_su_piana": 3275
},
"segno_scelto": -1,
"criterio": "le piramidi devono risultare sopra la piana; si sceglie il segno che massimizza la mediana(quota sulle impronte) - mediana(quota sulla piana)",
"margine_scelto_m": 7.85
}
},
"analisi_colonne": {
"Cheope (Khufu)": {
"pixel_nella_colonna": 276,
"intensita_media_dB": -8.01,
"solidita_media": 0.0663,
"solidita_max": 0.1014,
"quota_del_massimo_m": 6.2
},
"Chefren (Khafre)": {
"pixel_nella_colonna": 240,
"intensita_media_dB": -10.47,
"solidita_media": 0.0631,
"solidita_max": 0.1323,
"quota_del_massimo_m": 6.2
},
"Micerino (Menkaure)": {
"pixel_nella_colonna": 55,
"intensita_media_dB": -15.56,
"solidita_media": 0.0236,
"solidita_max": 0.0505,
"quota_del_massimo_m": 3.1
},
"deserto_controllo": {
"pixel_nella_colonna": 99,
"posizione_enu_m": [
394.1,
-821.2
],
"intensita_media_dB": -7.2,
"solidita_media": 0.18
},
"separabilita_vs_deserto": {
"Cheope (Khufu)": {
"delta_intensita_dB": -0.81,
"delta_solidita": -0.1137
},
"Chefren (Khafre)": {
"delta_intensita_dB": -3.27,
"delta_solidita": -0.1169
},
"Micerino (Menkaure)": {
"delta_intensita_dB": -8.36,
"delta_solidita": -0.1564
}
}
},
"geolocation_grid_xml": {
"descrizione": "F35/F36: i nodi VERI (non interpolati) della geolocation grid dello .xml. Non sono un piano: coprono tutta la scena con un rilievo reale fino a centinaia di metri. height_ref/xml_ref sono ora la bilineare LOCALE (F36) fra i quattro nodi reali della cella che contiene il ritaglio -- non una spline globale sui 231 nodi -- ma la spaziatura del reticolo e' enormemente piu' larga del ritaglio delle piramidi, quindi quella cella non ha rilievo locale da mostrare, e il risultato e' correttamente quasi piatto: e' un limite di risoluzione del riferimento, non un errore di calcolo.",
"spaziatura_reticolo_px": [
1511,
1333
],
"nodo_piu_vicino_al_ritaglio_km": 3.17,
"nodo_piu_vicino_al_ritaglio_quota_m": 64.0,
"rilievo_vero_su_tutta_la_scena_m": [
1.0,
610.0
]
},
"correzioni_applicate": [
{
"id": "F01",
"gravita": "critico",
"descrizione": "Il cubo tomografico ora contiene l'interferogramma y_i = s_i * conj(s_m) normalizzato, non le SLC grezze. Con le SLC grezze la fase di ogni data e' dominata dal termine di propagazione exp(-j4piR_i/lambda), che varia di migliaia di cicli fra date e sommerge completamente il termine k_z*z su cui si regge l'inversione."
},
{
"id": "F02",
"gravita": "critico",
"descrizione": "La fase di terra piatta e di topografia di riferimento e' rimossa analiticamente da orbita + geolocation grid (delta_R geometrico), non con una regressione su np.unwrap di uno scatter mascherato e appiattito, che su dati decorrelati e' un random walk e iniettava uno schermo di fase casuale."
},
{
"id": "F03",
"gravita": "alto",
"descrizione": "Interpolazione orbitale di Lagrange all'ordine 8 al posto di np.interp lineare. I vettori di stato distano 10 s: l'interpolazione lineare sbaglia di metri, e l'escursione di baseline utile e' di appena ~163 m."
},
{
"id": "F04",
"gravita": "alto",
"descrizione": "k_z calcolato con lo slant range e l'angolo di incidenza PROPRI di ciascuna acquisizione e di ciascun pixel (K_z = 4*pi*B_perp/(lambda*r_i*sin(theta))), non con un R medio scalare."
},
{
"id": "F05",
"gravita": "alto",
"descrizione": "Il segno di k_z non e' piu' assunto: viene calibrato sui dati verificando che le piramidi risultino SOPRA la piana e non sotto, e il margine della decisione viene riportato (validazione di livello 1, ch15)."
},
{
"id": "F06",
"gravita": "alto",
"descrizione": "Le sub-bande Doppler master/slave restano dentro lo spettro. Prima l'ultima sub-apertura slave sconfinava a 0.583*B_cD contro un limite di 0.5*B_cD, quindi le ultime marce del banco leggevano spettro vuoto."
},
{
"id": "F07",
"gravita": "alto",
"descrizione": "Il micro-moto si calcola su un chip esteso in azimuth (1024 linee dentro il burst) invece che sulle ~185 linee del chip tomografico. Con 185 linee la griglia Doppler ha 7.8 Hz per bin su 313 Hz totali: le 12 sub-aperture distavano meno di due bin l'una dall'altra e la decomposizione era priva di significato."
},
{
"id": "F08",
"gravita": "medio",
"descrizione": "Finestratura di Hann sulle sub-bande al posto del rect, che generava lobi laterali sinc in azimuth e sporcava il pixel tracking."
},
{
"id": "F09",
"gravita": "alto",
"descrizione": "L'energia di micro-moto e' la deviazione standard del vettore di shift COMPLESSO demediato, non std(|shift|). Con std(|shift|) una vibrazione a modulo costante -- il caso dell'oscillatore a 2 gradi di liberta' delle fonti, eq. (20) -- restituiva energia nulla."
},
{
"id": "F10",
"gravita": "medio",
"descrizione": "La griglia del micro-moto e' riportata al reticolo pieno con map_coordinates sulle coordinate reali dei nodi, non con zoom: zoom introduceva un offset di mezza finestra (~8 px) e poteva restituire una forma diversa da quella del cubo, rompendo il broadcast."
},
{
"id": "F11",
"gravita": "medio",
"descrizione": "I profili verticali mediano in POTENZA e convertono in dB alla fine. Mediare direttamente i dB introduce un bias sistematico."
},
{
"id": "F12",
"gravita": "medio",
"descrizione": "La colonna di deserto di controllo e' scelta dentro la copertura effettiva e verificata non vuota. Prima poteva cadere fuori dal chip, restituire zeri e produrre una separabilita' falsa."
},
{
"id": "F13",
"gravita": "medio",
"descrizione": "Il master e' il 'supermaster' che minimizza il costo di decorrelazione combinato (baseline + temporale), non semplicemente la prima data."
},
{
"id": "F14",
"gravita": "alto",
"descrizione": "Geocodifica per interpolazione bilineare LOCALE (F36) sulla geolocation grid, che e' un reticolo regolare 11x21. Prima si usava griddata + nan_to_num(media): i punti fuori dall'inviluppo venivano riempiti con la media, deformando la geometria."
},
{
"id": "F15",
"gravita": "concettuale",
"descrizione": "Separazione fra RISOLUZIONE e PRECISIONE. delta_z ~ 227 m e' la separazione di Rayleigh fra due diffusori nella stessa cella; la precisione sulla quota di un diffusore dominante e' sigma_h = lambda*R*sin(theta)*sigma_phi / (4*pi*sigma_Bperp) e con 11 baseline vale alcune decine di metri. La versione precedente concludeva 'non risolvibile' confondendo le due cose, e per questo non disegnava alcuna superficie."
},
{
"id": "F16",
"gravita": "concettuale",
"descrizione": "Layover e foreshortening sono calcolati e riportati. Con incidenza 39.4 gradi (angolo di vista ~34.8) e facce a 52 gradi la faccia rivolta al sensore e' in layover pieno: e' una proprieta' della geometria, non un artefatto, e va dichiarata prima di interpretare (ch14)."
},
{
"id": "F17",
"gravita": "nuovo",
"descrizione": "Superficie reale ricostruita pixel per pixel: quota di riferimento dalla geolocation grid dello .xml piu' quota residua stimata dal periodogramma multi-baseline sui .tiff VH, con maschera di qualita' sulla coerenza di fit. Prima il 3D mostrava solo piramidi geometriche ideali disegnate da costanti scritte a mano."
},
{
"id": "F18",
"gravita": "nuovo",
"descrizione": "Vista 3D con molti gradi di liberta': imbardata, beccheggio, rollio, traslazione, zoom, prospettiva/ortografica, esagerazione verticale, doppia soglia in quota, soglia di intensita', piano di sezione, attributo di colore selezionabile, illuminazione orientabile, livelli commutabili, controlli da tastiera e rispetto di prefers-reduced-motion."
},
{
"id": "F19",
"gravita": "basso",
"descrizione": "meta.json viene scritto una volta sola invece che due, e l'analisi dei profili non e' piu' annidata dentro la funzione di salvataggio."
},
{
"id": "F20",
"gravita": "basso",
"descrizione": "Ordinamento painter esplicito dal piu' lontano al piu' vicino, sia per i voxel sia per le facce della superficie. Prima l'ordine era ascendente su una profondita' di segno non verificato."
},
{
"id": "F21",
"gravita": "basso",
"descrizione": "Autotest interno (--selftest) che blocca le convenzioni di segno di apply_shift, del tracker sub-pixel e dell'interpolatore orbitale."
},
{
"id": "F22",
"gravita": "critico",
"descrizione": "La soglia di qualita' sulla superficie e' calibrata sulla DISTRIBUZIONE NULLA del periodogramma, non fissata a mano. Con 11 baseline e fasi puramente casuali il picco normalizzato ha gia' mediana 0.56 e 99mo percentile 0.80: una soglia scritta a mano a 0.35 accettava il 100 per cento dei pixel, rumore compreso, e faceva sembrare misurato cio' che non lo era."
},
{
"id": "F23",
"gravita": "alto",
"descrizione": "Stimatore di coerenza corretto. Poiche' y_i = s_i*conj(s_m)/|s_m|, la media di y_i NON e' la media di s_i*conj(s_m): la coerenza va ricostruita ripesando per l'ampiezza del master, altrimenti e' uno stimatore diverso e distorto."
},
{
"id": "F24",
"gravita": "critico",
"descrizione": "L'impronta delle piramidi e' calcolata nella GEOMETRIA RADAR, proiettando in avanti la superficie 3D attraverso range-Doppler, non come impronta al suolo. Un punto a 138 m di quota si sposta di h*cos(theta) in slant range, cioe' ~48 pixel: la maschera al suolo NON copriva i pixel dove l'apice cade davvero, e quindi calibrazione del segno e validazione guardavano i pixel sbagliati."
},
{
"id": "F28",
"gravita": "nuovo",
"descrizione": "L'area processata e' stretta sulle sole piramidi in GEOMETRIA RADAR piu' un margine di 150 m, invece di un rettangolo di 1.8 x 2.2 km su tutta la piana. Il ritaglio comprende lo spostamento in slant dovuto alla quota, altrimenti gli apici resterebbero fuori. Le celle da elaborare scendono da ~50 000 a ~8 000: il calcolo e' piu' rapido, il rendering 3D e' fluido, e la statistica non e' piu' diluita dal deserto circostante. --full-scene ripristina il comportamento precedente."
},
{
"id": "F29",
"gravita": "critico",
"descrizione": "La vista 3D non rispondeva ai comandi. Due cause: con prefers-reduced-motion attivo il ciclo di disegno non partiva affatto e la pagina restava all'unico fotogramma iniziale, quindi nessun cursore aveva effetto; e senza quell'impostazione il disegno rifaceva a ogni fotogramma 8 000 poligoni ordinati, con la stringa di colore ricostruita ogni volta, a pochi fotogrammi al secondo. Ora il disegno e' a richiesta su flag di aggiornamento, i vertici sono proiettati una volta sola per fotogramma invece di quattro volte per poligono, i colori vengono da una tabella precalcolata, e durante il trascinamento si disegna a risoluzione ridotta."
},
{
"id": "F27",
"gravita": "medio",
"descrizione": "Despicatura dichiarata della superficie per il rendering: i nodi che si discostano dalla mediana locale piu' di 3 sigma_h sono errori grossolani di aggancio su un lobo laterale, valgono centinaia di metri e da soli dominavano la scala delle quote, rendendo illeggibile una superficie che per il 98 per cento sta in poche decine di metri. La quota grezza resta nei .npy; il conteggio delle sostituzioni e' riportato."
},
{
"id": "F26",
"gravita": "concettuale",
"descrizione": "Il canale VH e' documentato come una SCELTA, con la sua misura di costo. La versione precedente lo giustificava come 'cross-pol, sensibile allo scattering di volume e alla vibrazione del suolo'. La misura dice il contrario: nella zona di layover le piramidi emergono di +1.7 dB in VH e di +8.4 dB in VV, e il picco su Cheope vale +10.5 dB in VH contro +22.2 dB in VV. Il ritorno delle facce a gradoni e' co-polarizzato; il cross-pol butta via oltre 10 dB proprio sui bersagli da misurare. Il programma resta su VH come richiesto, ma misura e riporta il costo, e --pol vv permette il confronto diretto."
},
{
"id": "F25",
"gravita": "alto",
"descrizione": "La validazione di livello 1 e' una REGRESSIONE fra quota misurata e quota simulata in geometria radar su tutti i pixel di qualita', non il percentile 90 della quota dentro l'impronta al suolo. Con le facce in layover il percentile 90 misurava la coda del rumore e restituiva rilievi di 300 m dove ce ne sono 138."
},
{
"id": "F30",
"gravita": "alto",
"descrizione": "La superficie misurata non e' piu' disegnata come maglia di poligoni ne' come campo continuo di celle: e' una NUVOLA DI PUNTI, un punto per nodo misurato, sia nella vista 3D sia nel pannello matplotlib. Il poligono univa quattro nodi qualsiasi e riempiva il vuoto fra di essi, quindi mostrava come superficie continua un campo in cui solo il 23 per cento delle celle supera la soglia calibrata sul nullo: il 77 per cento del colore sullo schermo era interpolazione, non misura. I nodi sotto soglia restano visibili come punti piccoli e spenti, e non passano piu' per misura solo perche' un vicino affidabile li tirava dentro un poligono; il filtro sulle celle di qualita' li toglie del tutto. Le sole maglie rimaste sono i riferimenti dichiarati - piramidi ideali e superficie simulata - che non sono misure. Il disegno resta sul budget di F29: i dischetti vengono da un atlante precalcolato, uno per colore della tabella, e in movimento la nuvola si decima di un fattore due per riga e colonna."
},
{
"id": "F31",
"gravita": "critico",
"descrizione": "Il canale di coerenza del micro-moto era vuoto. Era calcolato come |media(dev)| / media(|dev|) con dev = shifts - media(shifts): il numeratore e' la media di un vettore appena demediato, cioe' zero per costruzione, su ogni pixel e per qualsiasi dato. Il canale esisteva, veniva salvato in mm_coh.npy e non conteneva nulla. Ora la domanda e' quella del modello a 2 gradi di liberta' (ch12): la traccia e' un tono singolo o rumore bianco? Si risponde con lo spettro della traccia - che e' il blocco 9 delle fonti applicato alla singola marcia - e la misura e' la CONCENTRAZIONE spettrale, cioe' la quota di energia nella riga dominante esclusa la continua: 1 per un tono puro, 1/(N_D-1) = 0.091 per rumore bianco con N_D = 12. Insieme alla concentrazione viene ora riportata la frequenza meccanica della riga dominante, coerente con N_D come frequenza di campionamento della vibrazione (ch11), e la frazione di celle la cui riga cade dentro la banda osservabile dichiarata dal banco."
},
{
"id": "F32",
"gravita": "nuovo",
"descrizione": "Tre livelli nuovi nella scena 3D. (a) SUPERFICIE DI RIFERIMENTO: le quote dei pixel lette dalla geolocation grid degli .annotation.xml e interpolate con la bilineare locale di F14/F36, disegnate come fondale a filo di ferro. Non e' un DEM del plateau: sono 231 nodi su tutto lo swath, e sul ritaglio delle piramidi l'escursione totale e' di poco piu' di due metri; il valore e' scritto nella barra laterale perche' chi guarda non la scambi per topografia. (b) PUNTI DI MICRO-MOTO: un punto per pixel la cui traccia di vibrazione supera la soglia di concentrazione spettrale di F31, colorato sull'energia. Poggiano sulla superficie .xml perche' il micro-moto e' un attributo di superficie: il banco di sub-aperture non gli assegna una profondita', e disegnarlo a quote diverse suggerirebbe una tomografia che questi dati non fanno. (c) STRUTTURE INTERNE NOTE di Cheope e Chefren, prese da piramide_cheope_3d.py e piramide_kefren_3d.py, che restano la sorgente unica di quelle quote. Sono un riferimento archeologico e sono disegnate come tale, a filo di ferro e mai come punti: con delta_z verticale di 242 m e camere che misurano metri, nessuna di esse e' rilevabile da questi dati, e la sovrapposizione serve a dare la scala di quel divario, non a suggerire una rilevazione."
},
{
"id": "F33",
"gravita": "nuovo",
"descrizione": "Quattro correzioni alla scena 3D (goal utente 2026-08-31). (a) La superficie SIMULATA (il layover geometrico di simulate_pyramids_radar) non e' piu' disegnata: restava l'ultima delle maglie di riferimento che poteva essere confusa con una ricostruzione. La simulazione resta internamente per la validazione di livello 1 (regressione misurato-vs-simulato, F25) e per pyr_mask: non e' un risultato, e' un termine di paragone, e ora si vede solo li'. (b) La superficie di riferimento .xml e i punti di micro-moto che vi poggiano hanno un proprio reticolo (xml_ref), l'intera griglia multilooked n_l x n_p, mai decimato da surface_max_nodes: prima condividevano il reticolo rado della nuvola misurata e coincidevano con l'intera griglia solo per la dimensione di questo dataset, non per costruzione. (c) Le piramidi ideali e le strutture interne note condividono esattamente centro, angolo di rotazione (azimuth_deg, oggi 0 per tutte e tre) e quota di base, e sono proiettate dalla stessa project() rigida della vista: restano solidali sotto qualunque imbardata, beccheggio o rollio, verificato a vista ruotando la scena. (d) I voxel sono ora colorati per indice di PIENO/VUOTO (solidity_index, F31: energia del periodogramma x coerenza x (1 - micro-moto), quindi il micro-moto entra nel colore), non piu' per la sola ampiezza; il valore esportato e' ristirato per percentili solo ai fini del colore, il dato scientifico in solidity.npy resta la formula dichiarata. Resta un discriminante multi-attributo, non una rilevazione di cavita' risolta in profondita' (avvertenza invariata, ch08-ch09)."
},
{
"id": "F34",
"gravita": "alto",
"descrizione": "La superficie .xml (F33) non si vedeva come pixel. Era disegnata come maglia di quadrilateri semitrasparenti: su un terreno quasi piatto (poco piu' di 2 m di escursione sul ritaglio) il riempimento si fondeva otticamente con la griglia di sfondo a 100 m, e i singoli pixel del reticolo xml_ref non erano piu' riconoscibili come tali, anche se il dato sotto era gia' corretto e completo (F33). Ora e' un punto per pixel, come la nuvola misurata (F30), colorato sulla propria quota con una rampa grigio-acciaio dedicata (mai la rampa calda della misura, cosi' il riferimento resta riconoscibile), disegnato con lo stesso atlante precalcolato del resto della scena (F29) per restare fluido sugli ~8 000 pixel del ritaglio anche in movimento."
},
{
"id": "F35",
"gravita": "chiarimento",
"descrizione": "F34 documentava il quasi-piano di xml_ref (~2 m di escursione) come un fatto del ritaglio, senza spiegare la causa: i punti della geolocation grid dello .xml sono posizioni fisiche di pixel con una quota propria, NON un piano -- sull'intera scena il rilievo vero arriva a centinaia di metri (raw_gcp_nodes). Ma quella grid ha solo 11 x 21 = 231 nodi su tutta la scena, spaziati circa 1500 linee x 1300 pixel, mentre il ritaglio delle piramidi ne occupa una piccola frazione di UNO: nessun nodo reale cade abbastanza vicino da portare rilievo dentro la spline locale (height_ref/xml_ref), che quindi esce correttamente quasi piatta -- limite di risoluzione del riferimento .xml, non errore di calcolo. Ora i nodi grezzi (non interpolati) sono esposti nel payload e in un pannello dedicato della UI, con la distanza del nodo piu' vicino e il rilievo vero sulla scena, cosi' il limite e' ispezionabile invece che implicito."
},
{
"id": "F36",
"gravita": "critico",
"descrizione": "F35 spiegava perche' xml_ref esce quasi piatta, ma Geocoder usava ancora una spline bicubica GLOBALE (kx=ky=3) su tutti e 231 i nodi della scena: verificato sui quattro nodi VERI che racchiudono il ritaglio delle piramidi (linee 7540/9048, pixel 1304/2608, quote 80.0/51.0/64.0/64.0 m -- 29 m di escursione fra loro), la spline dava 70.0 m al centro del ritaglio mentre la bilineare fra quei quattro nodi da' 63.7 m: 6 m di differenza per curvatura importata da nodi a decine di km, non dal terreno locale. Il ritaglio sta interamente dentro UNA cella del reticolo (F35): la geocodifica ora usa RegularGridInterpolator bilineare, che per un punto in una cella usa esclusivamente i quattro nodi reali di quella cella -- i valori letti dallo .xml corrispondente, non un adattamento globale. L'estrapolazione lineare oltre il bordo del reticolo (fill_value=None) sostituisce la vecchia estrapolazione della spline, con lo stesso comportamento definito ovunque."
},
{
"id": "F37",
"gravita": "richiesta",
"descrizione": "Rimosso lo strato 3D 'Superficie .xml' (drawRef/buildRefColors/XCIDX): su questo ritaglio la quota di riferimento varia di poco piu' di 1 m (F35/F36), quindi disegnata come nuvola propria non aggiungeva nulla che il pannello 'Nodi grezzi della geolocation grid' non mostrasse gia' in forma numerica ispezionabile. NOTA sui file .xml: non esiste un tag <position> con la quota dei singoli pixel -- i 17 nodi <position> dell'annotation.xml sono i VETTORI DI STATO ORBITALI del satellite (coordinate ECEF x/y/z), non posizioni al suolo. L'unica quota per pixel nello .xml e' <geolocationGridPoint><height>, 231 nodi per scena: e' quella che height_ref/xml_ref usano (F36), presa dal file .annotation.xml del MASTER -- l'unico geometricamente corretto da usare per l'intero stack, perche' tutte le date sono coregistrate sul suo reticolo di pixel."
},
{
"id": "F38",
"gravita": "richiesta",
"descrizione": "Aggiunto il layer 'suolo (DEM)', portato da _fetch_dem() di piramide_acustica_vh.py / piramide_unificato.py (Piramid_V3): un DEM ESTERNO vero (Copernicus via l'API di elevazione Open-Meteo), campionato su un reticolo fitto SOLO nell'area del ritaglio e interpolato (RegularGridInterpolator bilineare) sulla stessa griglia (east, north) di height_ref. Risolve il rilievo che la geolocation grid dello .xml non puo' dare a questa scala (F35/F36): verificato, 18..94 m di escursione su un campione dello stesso ritaglio, contro gli ~1 m della bilineare .xml. E' un RIFERIMENTO esterno (fetch_dem_suolo(), cache in dem_suolo.npz, disattivabile con cfg.fetch_dem=False), non entra in nessun calcolo tomografico: la geometria .xml resta l'unica usata per fase, k_z e geocodifica. CORRETTO da F39: vedi sotto."
},
{
"id": "F39",
"gravita": "richiesta",
"descrizione": "Il 'suolo (DEM)' di F38 non seguiva il profilo delle piramidi e non era sul datum dei dati. Tre difetti, tutti verificati sui dati. (a) Il DEM esterno le piramidi non le contiene: interrogando l'API di elevazione esattamente sui tre apici noti restituisce 66 / 76 / 78 m, cioe' il plateau nudo -- l'apice di Cheope, che sta a ~198 m, usciva 130 m piu' in basso e il 'suolo' passava DENTRO le piramidi invece di seguirne le facce. Non era il passo del reticolo: anche interrogando il singolo punto dell'apice il valore resta 66 m. (b) Il livello veniva da un dataset con un datum verticale suo: 68.6 m di mediana sul ritaglio e 75.5 m sotto Cheope, contro i 63.1..64.2 m delle quote .xml, cioe' fino a ~12 m di scarto rispetto alla superficie misurata, che poggia sul datum .xml. (c) Se lo scaricamento falliva il layer spariva del tutto. Ora ground_dem_suolo() lo costruisce in tre pezzi dichiarati: DATUM = le quote lette dai file di stack_slc (<geolocationGridPoint><height> degli annotation.xml, bilineare locale del master, F36), lette da TUTTE le date come controllo di consistenza (plateau_heights_from_stack(): 11 date VH IW2, tutte 64.0 m sul nodo grezzo piu' vicino, che cade a 2.2-3.2 km); RILIEVO = il DEM esterno riportato su quel datum togliendo il suo scarto mediano sull'impronta delle piramidi, e senza rete resta la bilineare .xml, cosi' il layer c'e' comunque; PIRAMIDI = pyramid_profile_enu(), z = base + altezza * (1 - max(|dx|,|dy|)/semilato) sul reticolo ENU, con la base presa dal terreno sotto ciascuna impronta (non dal base_alt_m di letteratura) perche' il layer sia continuo con il terreno intorno, composto con np.maximum. Corretto anche il reticolo di query: l'API accetta 100 coordinate per richiesta e prima se ne mandava una sola, quindi il reticolo era bloccato a 10x10 (~170 m di passo); ora la richiesta e' spezzata in blocchi e cfg.dem_grid vale 24 (~70 m). Interruttori: cfg.suolo_dem (il layer), cfg.fetch_dem (il rilievo esterno), cfg.dem_pyramids (il profilo delle piramidi)."
},
{
"id": "F41",
"gravita": "richiesta",
"descrizione": "La nuvola di voxel mette il 46.4% dei punti SOPRA la superficie e il 23.4% sopra l'apice di Cheope, e la pagina non diceva perche'. Non e' un difetto del disegno, sono due fatti sovrapposti. (1) L'asse z e' un intervallo di RICERCA simmetrico attorno al datum (+-elev_max = 400 m): meta' sta in aria per costruzione e nulla nell'inversione obbliga la soluzione a stare sottoterra. (2) Dove finisce l'energia lo decide la PSF verticale della pila, e con 8 baseline quella PSF non discrimina. Misurato sul ritaglio delle piramidi da vertical_lobe_profile(): picco a -12.5 m, cioe' sulla superficie, corretto; lobo principale a -3 dB largo 150 m (da -87.5 a +62.5 m); ma il LOBO LATERALE PEGGIORE sta a -1.16 dB, poco piu' di un dB sotto il picco, e ai bordi dell'asse la curva vale ancora -1.9 / -2.7 dB, per 5.07 dB di contrasto su tutti gli 800 m dell'asse. Un picco che i suoi lobi quasi eguagliano non localizza nulla in profondita'. Aggravante di resa: l'asse e' campionato a 3.125 m, 91 volte piu' fitto della delta_z di Rayleigh (283.5 m), quindi la nuvola sembra dettagliata per sovracampionamento. build_html disegna ora quel profilo nel pannello 'Lobi verticali' accanto ai comandi dei voxel, con la riga dei -3 dB, la barra di delta_z in scala e le due frazioni di voxel sopra il suolo. La nuvola NON viene ritagliata a z<=0: nasconderne meta' darebbe un'immagine piu' credibile e piu' falsa. La correzione vera e' piu' baseline, non un filtro sul disegno."
},
{
"id": "F42",
"gravita": "critico",
"descrizione": "Ogni data veniva LETTA alla stessa finestra assoluta del master e riallineata dopo con apply_shift(), che e' una traslazione CIRCOLARE via rampa di fase. Vale per frazioni di pixel, non per l'inquadramento del prodotto: sulla stessa traccia relativa 58 il bersaglio di Giza cade a -4510 linee nei prodotti S1A e a +30 nei S1D rispetto al master S1C, e fino a -108 pixel in range. Con 89 linee di ritaglio, per 16 date su 28 lo 'slave' era un pezzo di deserto a 63 km di distanza, ripiegato su se stesso dalla traslazione circolare e per giunta dirampato con i parametri del burst sbagliato: interferogrammi di puro rumore, e la pila multi-missione (che e' esattamente cio' che allarga l'escursione di baseline da 163 a 273 m) non era utilizzabile. Anche restando su una sola missione l'offset in range di alcune decine di pixel faceva avvolgere una colonna su otto del ritaglio. Ora l'offset INTERO entra nella finestra di lettura e nell'indice di burst passato al deramping TOPS; alla rampa di fase resta il solo residuo sub-pixel. Se il ritaglio spostato scavalcherebbe il bordo del burst o del prodotto la data viene scartata e detta a voce alta, perche' il deramping TOPS non e' definito a cavallo di due burst."
},
{
"id": "F43",
"gravita": "alto",
"descrizione": "_omogenea() separava le acquisizioni per il solo verso di passaggio. Due tracce ascendenti DIVERSE sono incompatibili quanto un'ascendente e una discendente: guardano lo stesso punto da posizioni orbitali distanti centinaia di chilometri, quindi baseline fuori scala e coerenza nulla. Il criterio ora e' verso + orbita relativa, letta dal manifest.safe accanto all'annotation (con ricaduta sul solo verso nel layout piatto, dove il manifest non c'e')."
},
{
"id": "F44",
"gravita": "medio",
"descrizione": "Il default di --gamma-min era 0.35, cioe' proprio la costante che F22 aveva tolto, e main() lo passava sempre alla Config (che ha default 0.0). Restava innocuo solo perche' la soglia calibrata sul nullo e' piu' alta di 0.35 con le pile finora usate; con una pila abbastanza numerosa la soglia nulla scende e il pavimento tornerebbe a decidere lui. Il default e' ora 0.0, coerente con Config."
},
{
"id": "F45",
"gravita": "medio",
"descrizione": "ground_dem_suolo() usava `m_lat` nella riga di resoconto del reticolo DEM, ma in quello scope il nome non esiste: NameError. Il ramo scatta solo al PRIMO scaricamento riuscito (nessuna cache .npz) e con verbose, quindi bastava avere gia' il file per non vederlo mai. Ora usa la costante M_PER_GRADO_LAT. Trovato con mypy, non a occhio."
},
{
"id": "F46",
"gravita": "critico",
"descrizione": "Il residuo sub-pixel di coregistrazione veniva preso dal picco della cross-correlazione di fase dell'intero chip ogni volta che il rapporto picco/mediana superava 8 e il picco stava entro 2 pixel dal residuo geometrico: 14 date su 41. Misurato sul VH di Giza (master 20260503): quel picco cadeva quasi sempre a UN PIXEL INTERO dal residuo geometrico (+1.15, -1.10, +1.85 ...) e, applicato, ABBASSAVA la coerenza con il master -- 0.277 -> 0.187 il 3 gennaio, 0.320 -> 0.225 il 22 maggio -- mentre lo spostamento che la massimizza sta entro un pixel dal residuo geometrico e la porta a 0.346 e 0.327. Su un chip di 90 x 372 pixel in cross-pol con coerenza 0.3 la correlazione di fase sbianca lo spettro e insegue le strutture di ampiezza (il layover delle piramidi), non la fase. Ora il residuo lo decide la coerenza stessa: refine_shift_by_coherence() parte dal residuo geometrico e cerca su una griglia grossa-fine (raggio 2 px, passo 0.5 -> 0.125) lo spostamento che massimizza la coerenza mediana con il master. Il picco di correlazione resta calcolato e riportato accanto, per confronto. Autotest 8."
},
{
"id": "F47",
"gravita": "alto",
"descrizione": "CDSE consegna i prodotti a fette lungo l'orbita, e la stessa passata puo' arrivare in due fette adiacenti con la stessa data (le due S1D del 2026-06-27). _stack_safe() le metteva entrambe in pila. Per quella che non contiene Giza l'inversione della geocodifica, vincolata al reticolo, si fermava sul bordo e ne usciva un offset di finestra senza senso (-4408 linee), scartato da F42 per caso e con un messaggio fuorviante; se entrambe lo avessero contenuto (zona di sovrapposizione) la stessa acquisizione sarebbe entrata due volte con baseline identica, un campione contato doppio nel periodogramma, nel nullo e nella scelta del supermaster. Ora Geocoder.dentro() riconosce il bersaglio fuori prodotto e una data entra una volta sola, PRIMA del calcolo delle baseline, con il motivo detto a voce alta."
},
{
"id": "F48",
"gravita": "medio",
"descrizione": "--dates valeva 11 per default: con 42 prodotti sul disco il programma ne usava in silenzio i primi 11 in ordine di data, e la pila multi-missione che allarga l'escursione di baseline restava fuori a meno di ricordarsi --dates 99. Ora 0 (il default) significa tutte le date presenti; un valore positivo resta un limite esplicito."
},
{
"id": "F49",
"gravita": "medio",
"descrizione": "plateau_heights_from_stack() confrontava fra le date la quota del nodo grezzo della geolocation grid PIU' VICINO alle piramidi. In una pila a piu' missioni l'inquadramento cambia da un prodotto all'altro (4500 linee fra S1A e S1C), quindi il nodo piu' vicino non e' lo stesso punto di terreno: 39 m in un prodotto, 64 m nell'altro, e l'avviso 'le date non concordano sul datum' scattava su un disaccordo che non esiste. Ora si confronta la grandezza usata davvero come datum, la bilineare locale di ciascuna data valutata sulle piramidi, e lo scarto massimo fra le date viene riportato come incertezza del layer. Misurato sulla pila a 41 date: 44..64 m, cioe' 20 m di incertezza sul datum a seconda del prodotto che fa da master."
},
{
"id": "F50",
"gravita": "basso",
"descrizione": "Il controllo di livello 2 confrontava sigma_h (8.5 m) con la deviazione STANDARD della quota sulla piana (77 m), dominata dalla coda degli errori grossolani da centinaia di metri che F27 toglie solo dal disegno: il confronto falliva sempre per costruzione. Ora viene riportata anche la dispersione robusta (1.4826 * MAD), che descrive il nucleo gaussiano ed e' la grandezza confrontabile con sigma_h."
}
],
"avvertenza": "La superficie e' una misura: quota di riferimento dallo .xml piu' quota del diffusore dominante stimata dai .tiff. La sua precisione e' ~8 m. La RISOLUZIONE verticale e' 132 m: nessuna struttura interna e' separabile. L'indice di solidita' e' un discriminante multi-attributo, non una rilevazione di cavita'."
}----------------------------------------------------------------------------
BUDGET TOMOGRAFICO MULTI-BASELINE
----------------------------------------------------------------------------
lunghezza d'onda radar = 5.55 cm
slant range R = 850.84 km
angolo di incidenza th = 36.83 gradi
baseline impilate = 43
escursione baseline ortogonali = 297.1 m
deviazione standard delle baseline = 63.5 m
RISOLUZIONE (separazione di Rayleigh fra due diffusori)
delta_z = lambda*R/(2*B) in slant = 79.4 m
proiettata in verticale = 132.5 m
altezza di ambiguita' = 12715.9 m
celle sull'altezza del target = 1.05
>> struttura interna separabile? NO
PRECISIONE (quota di UN diffusore dominante) -- F15
coerenza tipica assunta gamma = 0.42
sigma_h = lambda*R*sin(th)*sigma_phi/(4*pi*sigma_B)
= 8.3 m
altezza del target = 138.5 m
>> superficie reale misurabile? SI
Le due righe non si contraddicono: separare due diffusori dentro la
stessa cella e stimare la quota di quello dominante sono problemi
diversi. Confonderli e' l'errore concettuale corretto in F15.
----------------------------------------------------------------------------
----------------------------------------------------------------------------
BANCO DI SUB-APERTURE DOPPLER (micro-moto)
----------------------------------------------------------------------------
banda Doppler totale B_cD = 313.00 Hz
banda di guardia B_DL = 156.50 Hz
larghezza sub-banda B_sub = 156.50 Hz
separazione master/slave B_shift = 28.17 Hz
passo di marcia = 11.67 Hz
sub-aperture N_D = 12
risoluzione griglia Doppler = 2.193 Hz/bin
bin per sub-banda = 71.4
MAPPATURA FREQUENZA -> TEMPO (dal Doppler rate dell'annotation)
azimuth FM rate k_a = -2188.3 Hz/s
rate TOPS combinata k_t = 1491.5 Hz/s
tempo di illuminazione del target = 143.0 ms
passo temporale fra sub-aperture = 5.33 ms
ritardo master-slave = 12.87 ms
finestra osservata (marcia completa)= 58.64 ms
campionamento meccanico f_s = 187.57 Hz
frequenza osservabile max (Nyquist) = 38.84 Hz
frequenza osservabile min (finestra)= 17.05 Hz
>> il banco risolve una banda di frequenze meccaniche
PERCHE' LA TOMOGRAFIA ACUSTICA DELLE FONTI QUI NON E' APPLICABILE
apertura sintetica L_sa = 958 m
lambda acustica a 38.8 Hz (v=6000 m/s) = 154 m
delta_z acustica = lambda*R/(2*L_sa) = 68.5 km
Limite dei dati: il TOPS di Sentinel-1 illumina un bersaglio per
143 ms soltanto, quindi la traccia di vibrazione dura 59 ms
e la frequenza meccanica accessibile e' di decine di Hz. Le fonti
lavorano su spotlight con B_cD ~ 22 kHz e indagano a 12.5 kHz: due
ordini di grandezza in piu'. E' questa la ragione per cui qui la
profondita' viene dalle baseline orbitali e non dal micro-moto, che
resta un attributo di superficie e nulla di piu'.
----------------------------------------------------------------------------