Download this notebook from github.
Example to compute image cross spectrum between different looks within a WV Sentinel-1 SLC product
in WV images (20 km X 20 km) there is only one burst (thus no overlapping area).
[1]:
import xsar
import warnings
import logging
from importlib import reload
reload(logging)
logging.basicConfig(level=logging.INFO)
logging.info('go')
# warnings.simplefilter(action='ignore', category=FutureWarning)
warnings.filterwarnings("ignore")
#tmp = xsar.get_test_file('S1A_WV_SLC__1SSV_20160510T101603_20160510T102143_011195_010EA1_Z010.SAFE')
tmp = xsar.get_test_file('S1A_WV_SLC__1SSV_20191005T100804_20191005T101314_029322_035533_0597.SAFE') # very small product
# print(tmp)
# tmp = '/home/datawork-cersat-public/cache/project/mpc-sentinel1/data/esa/sentinel-1a/L2/WV/S1A_WV_OCN__2S/2016/131/S1A_WV_OCN__2SSV_20160510T101603_20160510T102143_011195_010EA1_F972.SAFE'
# tmp = '/home/datawork-cersat-public/cache/project/mpc-sentinel1/data/esa/sentinel-1a/L1/WV/S1A_WV_SLC__1S/2016/131/S1A_WV_SLC__1SSV_20160510T101603_20160510T102143_011195_010EA1_7038.SAFE'
# tmp = '/home/datawork-cersat-public/cache/project/mpc-sentinel1/data/esa/sentinel-1a/L1/WV/S1A_WV_SLC__1S/2023/014/S1A_WV_SLC__1SSV_20230114T130811_20230114T133351_046780_059BC5_FED5.SAFE'
strwv = 'SENTINEL1_DS:'+tmp+':WV_017'
print(strwv)
xsar_instance = xsar.Sentinel1Dataset(strwv)
xsar_instance
INFO:root:go
SENTINEL1_DS:/home1/scratch/agrouaze/xsardatasync/xsardata/S1A_WV_SLC__1SSV_20191005T100804_20191005T101314_029322_035533_0597.SAFE:WV_017
[1]:
<Sentinel1Dataset full coverage object>
[2]:
xsar_instance.dataset
[2]:
<xarray.Dataset> Size: 224MB Dimensions: (pol: 1, line: 4923, sample: 5681) Coordinates: * line (line) int64 39kB 0 1 2 3 4 5 ... 4918 4919 4920 4921 4922 * sample (sample) int64 45kB 0 1 2 3 4 5 ... 5676 5677 5678 5679 5680 * pol (pol) object 8B 'VV' Data variables: digital_number (pol, line, sample) complex64 224MB dask.array<chunksize=(1, 4923, 5000), meta=np.ndarray> time (line) datetime64[ns] 39kB 2019-10-05T10:11:58.450274048 ... sampleSpacing float64 8B 1.498 lineSpacing float64 8B 4.133 Attributes: (12/15) name: SENTINEL1_DS:/home1/scratch/agrouaze/xsardatasync/xsar... short_name: SENTINEL1_DS:S1A_WV_SLC__1SSV_20191005T100804_20191005... product: SLC safe: S1A_WV_SLC__1SSV_20191005T100804_20191005T101314_02932... swath: WV multidataset: False ... ... start_date: 2019-10-05 10:11:58.450260 stop_date: 2019-10-05 10:12:01.432986 footprint: POLYGON ((-61.07570128124852 28.34141558287481, -61.28... coverage: 20km * 20km (line * sample ) orbit_pass: Descending platform_heading: -167.4153352100693
[3]:
xsar_instance.dataset.digital_number.values[0:10,0:10]
[3]:
array([[[ 0. +0.j, 0. +0.j, 0. +0.j, ..., 0. +0.j,
0. +0.j, 0. +0.j],
[ 0. +0.j, 0. +0.j, 0. +0.j, ..., 0. +0.j,
0. +0.j, 0. +0.j],
[ 0. +0.j, 0. +0.j, 0. +0.j, ..., 14. +15.j,
64. -30.j, 43. -46.j],
...,
[ -12.+243.j, -69. -81.j, 13. -53.j, ..., 82. +53.j,
190. +4.j, 108.-126.j],
[ 87. -29.j, -120. -67.j, 83. +82.j, ..., 123.+140.j,
232. -8.j, -123.-134.j],
[ -29. +21.j, -34. -6.j, -44. +99.j, ..., 213. +40.j,
325.+204.j, 99. -20.j]]], dtype=complex64)
display digital numbers
[4]:
import holoviews as hv
import numpy as np
from holoviews.operation.datashader import datashade,rasterize
hv.extension('bokeh')
[5]:
tmp = abs(xsar_instance.dataset['digital_number'].sel(pol='VV'))
DN = tmp.rolling({"sample":10,"line":10}).mean()
DN
[5]:
<xarray.DataArray 'digital_number' (line: 4923, sample: 5681)> Size: 112MB dask.array<truediv, shape=(4923, 5681), dtype=float32, chunksize=(4923, 5009), chunktype=numpy.ndarray> Coordinates: * line (line) int64 39kB 0 1 2 3 4 5 6 ... 4917 4918 4919 4920 4921 4922 * sample (sample) int64 45kB 0 1 2 3 4 5 6 ... 5675 5676 5677 5678 5679 5680 pol <U2 8B 'VV' Attributes: comment: denoised digital number, read at full resolution history: digital_number: measurement/s1a-wv1-slc-vv-20191005t101158-2019...
[6]:
rasterize(hv.Image(DN.values).opts(width=800,height=700,cmap='Greys',colorbar=True))# clim=(0,40)
[6]:
compute the periodograms and the looks inside the periodograms to get a cross spectra
[7]:
from xsarslc.processing.xspectra import compute_WV_intraburst_xspectra
import time
t0 = time.time()
xs0 = compute_WV_intraburst_xspectra(dt=xsar_instance.datatree,
polarization='VV',periodo_width={"line":2000,"sample":2000},
periodo_overlap={"line":1000,"sample":1000})
print('time to compute x-spectra on WV :%1.1f sec'%(time.time()-t0))
xs0
INFO:root:nbtiles : 1
time to compute x-spectra on WV :67.9 sec
[7]:
<xarray.Dataset> Size: 4MB Dimensions: (bt_thresh: 5, 0tau: 3, freq_line: 97, freq_sample: 274, 1tau: 2, 2tau: 1, c_sample: 2, c_line: 2, k_gp: 4, phi_hf: 5, lambda_range_max_macs: 11) Coordinates: pol <U2 8B 'VV' * bt_thresh (bt_thresh) int64 40B 5 50 100 150 200 k_rg (freq_sample) float64 2kB 0.0 0.003143 ... 0.858 k_az (freq_line) float64 776B -0.1505 ... 0.1505 line int64 8B 2461 sample int64 8B 2840 longitude float64 8B -61.2 latitude float64 8B 28.27 * k_gp (k_gp) int64 32B 1 2 3 4 * phi_hf (phi_hf) int64 40B 1 2 3 4 5 * lambda_range_max_macs (lambda_range_max_macs) float64 88B 25.0 ... 275.0 Dimensions without coordinates: 0tau, freq_line, freq_sample, 1tau, 2tau, c_sample, c_line Data variables: (12/29) incidence float64 8B 24.19 ground_heading float64 8B -168.5 sensing_time datetime64[ns] 8B 2019-10-05T10:11:59.941637632 tile_width_sample int64 8B 20581 tile_width_line int64 8B 20138 sigma0 float64 8B 0.1942 ... ... burst_corner_longitude (c_sample, c_line) float64 32B -61.08 ... -61.32 burst_corner_latitude (c_sample, c_line) float64 32B 28.34 ... 28.2 cwave_params (k_gp, phi_hf) float64 160B 5.554 ... 0.04234 macs (lambda_range_max_macs) complex128 176B (0.3104... azimuth_cutoff float64 8B 191.6 azimuth_cutoff_error float64 8B 0.01349 Attributes: (12/21) name: SENTINEL1_DS:/home1/scratch/agrouaze/xsard... short_name: SENTINEL1_DS:S1A_WV_SLC__1SSV_20191005T100... product: SLC safe: S1A_WV_SLC__1SSV_20191005T100804_20191005T... swath: WV multidataset: False ... ... radar_frequency: 5405000704.0 azimuth_time_interval: 0.0006059988896297211 required_tile_width_line: 20138.934607 required_tile_width_sample: 20580.035599866915 required_tile_overlap_sample: 0.0 required_tile_overlap_line: 0.0
[8]:
import numpy as np
from xsarslc.processing import xspectra
xs = xs0.swap_dims({'freq_line': 'k_az', 'freq_sample': 'k_rg'})
xs = xspectra.symmetrize_xspectrum(xs['xspectra_2tau'], dim_range='k_rg', dim_azimuth='k_az')
############################################ real part ############################
coS=np.abs(xs.mean(dim='2tau').real)
coS_reduced = coS.where(np.logical_and(np.abs(coS.k_rg)<=0.14, np.abs(coS.k_az)<=0.14), drop=True)
from matplotlib import pyplot as plt
%matplotlib inline
from matplotlib import colors as mcolors
cmap = mcolors.LinearSegmentedColormap.from_list("", ["white","violet","mediumpurple","cyan","springgreen","yellow","red"])
PuOr = plt.get_cmap('PuOr')
plt.figure(figsize=(8,6))
#coS_reduced_av=coS_reduced.rolling(k_rg=3, center=True).mean().rolling(k_az=3, center=True).mean()
coS_reduced.plot(cmap=cmap, levels=20, vmin=0)
plt.grid()
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.axis('scaled')
############################################ imag.part ############################
ims = xs.mean(dim='2tau').imag.squeeze()
xS_red = ims.where(np.logical_and(np.abs(ims.k_rg)<=0.14, np.abs(ims.k_az)<=0.14), drop=True)
#xS_av=xS_red.rolling(k_rg=3, center=True).mean().rolling(k_az=3, center=True).mean()
plt.figure(figsize=(8,6))
xS_red.plot(x='k_rg',cmap=PuOr)
plt.grid()
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.axis('scaled')
[8]:
(-0.13984940037445776,
0.13984940037445776,
-0.13949481344309983,
0.13949481344309983)