Download this notebook from github.


A notebook to illustrate how to compute and correct Impulse Response in IW SLC product

compute IW1 impulse response

[1]:
import warnings
warnings.filterwarnings("ignore")
from xsarslc.processing.impulseResponse import generate_IWS_AUX_file_ImpulseReponse
# SENTINEL1_DS:/home/datawork-cersat-public/cache/project/mpc-sentinel1/data/esa/sentinel-1a/L1/WV/S1A\_WV\_SLC\_\_1S/2018/050/S1A\_WV\_SLC\_\_1SSV\_20180219T221522\_20180219T222851\_020681\_0236CE\_8F55.SAFE:WV_051
subswathes = {'/home/datawork-cersat-public/cache/project/mpc-sentinel1/data/esa/sentinel-1a/L1/IW/S1A_IW_SLC__1S/2022/271/S1A_IW_SLC__1SDV_20220928T095555_20220928T095622_045203_056722_FB4F.SAFE/':[1],
             }
subswath_number = 1

IRs_IW1_VV = generate_IWS_AUX_file_ImpulseReponse(subswathes, subswath_number , polarization='VV')
IRs_IW1_VV
#IRs_IW1_VH = generate_IWS_AUX_file_ImpulseReponse(subswathes, subswath_number , polarization='VH')
#IRs_IW1_VH
path: /home/datawork-cersat-public/cache/project/mpc-sentinel1/data/esa/sentinel-1a/L1/IW/S1A_IW_SLC__1S/2022/271/S1A_IW_SLC__1SDV_20220928T095555_20220928T095622_045203_056722_FB4F.SAFE/
[1]:
<xarray.Dataset>
Dimensions:         (k_srg: 2048, k_az: 256)
Coordinates:
    pol             <U2 'VV'
    burst           int64 1
  * k_srg           (k_srg) float64 -1.349 -1.347 -1.346 ... 1.345 1.346 1.347
  * k_az            (k_az) float64 -0.2236 -0.2219 -0.2201 ... 0.2201 0.2219
Data variables:
    range_IR        (k_srg) float64 0.0005885 0.0005878 ... 0.0005874 0.0005885
    mean_incidence  float64 33.5
    azimuth_IR      (k_az) float64 0.002508 0.002509 ... 0.00251 0.002507
Attributes: (12/21)
    long_name:              Impulse response in range direction
    name:                   SENTINEL1_DS:/home/datawork-cersat-public/cache/p...
    short_name:             SENTINEL1_DS:S1A_IW_SLC__1SDV_20220928T095555_202...
    product:                SLC
    safe:                   S1A_IW_SLC__1SDV_20220928T095555_20220928T095622_...
    swath:                  IW
    ...                     ...
    platform_heading:       -168.0316299165244
    comment:                denoised digital number, read at full resolution
    history:                digital_number: /home/datawork-cersat-public/cach...
    radar_frequency:        5405000454.33435
    azimuth_time_interval:  0.002055556299999998
    subswath:               IW1

save IR file to netCDF

[2]:
out_file = "/tmp/S1_IR_IW1_VV_AUX_FILE.nc"
if 'footprint' in IRs_IW1_VV.attrs:
    IRs_IW1_VV.attrs.update({'footprint': str(IRs_IW1_VV.footprint)})
if 'multidataset' in IRs_IW1_VV.attrs:
    IRs_IW1_VV.attrs.update({'multidataset': str(IRs_IW1_VV.multidataset)})
IRs_IW1_VV.to_netcdf(out_file)
print(out_file)
/tmp/S1_IR_IW1_VV_AUX_FILE.nc

display IW1 range impulse response for VV and VH

[3]:
from matplotlib import pyplot as plt
IRs_IW1_VV['range_IR'].plot(label='VV')
#IRs_IW1_VH['range_IR'].plot(label='VH',alpha=0.7)
plt.legend()
plt.grid(True)
plt.title('burst = %s subswath = %s'%(IRs_IW1_VV.burst.values,IRs_IW1_VV.attrs['subswath']))
[3]:
Text(0.5, 1.0, 'burst = 1 subswath = IW1')
../_images/examples_example_IW_compute_and_correct_from_impulse_response_6_1.png

display IW1 azimuth impulse response for VV and VH

[4]:
from matplotlib import pyplot as plt
IRs_IW1_VV['azimuth_IR'].plot(label='VV')
#IRs_IW1_VH['azimuth_IR'].plot(label='VH',alpha=0.7)
plt.legend()
plt.grid(True)
plt.title('burst = %s subswath = %s'%(IRs_IW1_VV.burst.values,IRs_IW1_VV.attrs['subswath']))
[4]:
Text(0.5, 1.0, 'burst = 1 subswath = IW1')
../_images/examples_example_IW_compute_and_correct_from_impulse_response_8_1.png

apply IR correction when computing a cross spectra

[5]:
import xsarslc
import xsar
import os
one_tiff = '/home/datawork-cersat-public/cache/project/mpc-sentinel1/data/esa/sentinel-1a/L1/IW/S1A_IW_SLC__1S/2022/127/S1A_IW_SLC__1SDV_20220507T162411_20220507T162439_043107_0525DE_734D.SAFE/measurement/s1a-iw1-slc-vv-20220507t162411-20220507t162439-043107-0525de-004.tiff'
fullpathsafeSLC = os.path.dirname(os.path.dirname(one_tiff))
imagette_number = os.path.basename(one_tiff).split('-')[1].replace('iw','')
str_gdal = 'SENTINEL1_DS:%s:IW%s'%(fullpathsafeSLC,imagette_number)
print('str_gdal',str_gdal)
xsarobj = xsar.Sentinel1Dataset(str_gdal) #,resolution='30m'
xsarobj
str_gdal SENTINEL1_DS:/home/datawork-cersat-public/cache/project/mpc-sentinel1/data/esa/sentinel-1a/L1/IW/S1A_IW_SLC__1S/2022/127/S1A_IW_SLC__1SDV_20220507T162411_20220507T162439_043107_0525DE_734D.SAFE:IW1
[5]:
<Sentinel1Dataset full coverage object>
[6]:
dt = xsarobj.datatree
dt.load()
dt
[6]:
<xarray.DatasetView>
Dimensions:  ()
Data variables:
    *empty*
Attributes: (12/15)
    name:              SENTINEL1_DS:/home/datawork-cersat-public/cache/projec...
    short_name:        SENTINEL1_DS:S1A_IW_SLC__1SDV_20220507T162411_20220507...
    product:           SLC
    safe:              S1A_IW_SLC__1SDV_20220507T162411_20220507T162439_04310...
    swath:             IW
    multidataset:      False
    ...                ...
    start_date:        2022-05-07 16:24:11.657511
    stop_date:         2022-05-07 16:24:39.551410
    footprint:         POLYGON ((-156.007554522451 22.11305598776757, -156.82...
    coverage:          190km * 86km (line * sample )
    orbit_pass:        Descending
    platform_heading:  -167.7204378813183
[7]:
import xsarslc.processing.xspectra
intra_xs_without_IR = xsarslc.processing.xspectra.compute_IW_subswath_intraburst_xspectra(dt,
                                         tile_width={'sample': 5.e3, 'line': 5.e3},
                                         tile_overlap={'sample': -10.e3, 'line': -10.e3},
                                         periodo_width = {'sample': 4000, 'line': 4000},
                                        periodo_overlap = {'sample': 2000, 'line': 2000},
                                        polarization='VV',dev=True)
intra_xs_without_IR
intrabursts: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:08<00:00,  8.78s/it]
[7]:
<xarray.Dataset>
Dimensions:                   (tile_sample: 6, tile_line: 2, bt_thresh: 5,
                               0tau: 3, freq_line: 57, freq_sample: 446,
                               1tau: 2, 2tau: 1, c_sample: 2, c_line: 2,
                               k_gp: 4, phi_hf: 5, lambda_range_max_macs: 10)
Coordinates:
    pol                       <U2 'VV'
  * bt_thresh                 (bt_thresh) int64 5 50 100 150 200
    k_rg                      (tile_line, tile_sample, freq_sample) float64 0...
    k_az                      (freq_line) float64 -0.04409 -0.04251 ... 0.04409
    line                      (tile_line) int64 209 1280
    sample                    (tile_line, tile_sample) int64 1274 4661 ... 19158
    longitude                 (tile_line, tile_sample) float64 -156.1 ... -156.8
    latitude                  (tile_line, tile_sample) float64 22.1 ... 22.09
  * k_gp                      (k_gp) int64 1 2 3 4
  * phi_hf                    (phi_hf) int64 1 2 3 4 5
  * lambda_range_max_macs     (lambda_range_max_macs) float64 50.0 ... 275.0
Dimensions without coordinates: tile_sample, tile_line, 0tau, freq_line,
                                freq_sample, 1tau, 2tau, c_sample, c_line
Data variables: (12/27)
    incidence                 (tile_line, tile_sample) float64 31.21 ... 36.22
    ground_heading            (tile_line, tile_sample) float64 -168.9 ... -169.2
    burst                     (tile_line) int64 0 0
    sensing_time              (tile_line, tile_sample) datetime64[ns] 2022-05...
    sigma0                    (tile_line, tile_sample) float64 0.1109 ... 0.0...
    nesz                      (tile_line, tile_sample) float64 0.003995 ... 0...
    ...                        ...
    corner_line               (tile_line, c_line) int64 31 387 1102 1458
    corner_sample             (tile_line, tile_sample, c_sample) int64 718 .....
    burst_corner_longitude    (tile_line, c_sample, c_line) float64 -156.0 .....
    burst_corner_latitude     (tile_line, c_sample, c_line) float64 22.11 ......
    cwave_params              (tile_line, tile_sample, k_gp, phi_hf, 2tau) float64 ...
    macs                      (tile_line, tile_sample, lambda_range_max_macs, 2tau) complex128 ...
Attributes: (12/24)
    name:                   SENTINEL1_DS:/home/datawork-cersat-public/cache/p...
    short_name:             SENTINEL1_DS:S1A_IW_SLC__1SDV_20220507T162411_202...
    product:                SLC
    safe:                   S1A_IW_SLC__1SDV_20220507T162411_20220507T162439_...
    swath:                  IW
    multidataset:           False
    ...                     ...
    radar_frequency:        5405000454.33435
    azimuth_time_interval:  0.002055556299999998
    tile_width_sample:      5000.0
    tile_width_line:        5000.0
    tile_overlap_sample:    -10000.0
    tile_overlap_line:      -10000.0
[8]:
IR_path = out_file
intra_xs_with_IR = xsarslc.processing.xspectra.compute_IW_subswath_intraburst_xspectra(dt,
                                         tile_width={'sample': 5.e3, 'line': 5.e3},
                                         tile_overlap={'sample': -10.e3, 'line': -10.e3},
                                         periodo_width = {'sample': 4000, 'line': 4000},
                                        periodo_overlap = {'sample': 2000, 'line': 2000},
                                        polarization='VV',dev=True,IR_path=IR_path)
intra_xs_with_IR
intrabursts: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:07<00:00,  7.44s/it]
[8]:
<xarray.Dataset>
Dimensions:                   (tile_sample: 6, tile_line: 2, bt_thresh: 5,
                               0tau: 3, freq_line: 57, freq_sample: 446,
                               1tau: 2, 2tau: 1, c_sample: 2, c_line: 2,
                               k_gp: 4, phi_hf: 5, lambda_range_max_macs: 10)
Coordinates:
    pol                       <U2 'VV'
  * bt_thresh                 (bt_thresh) int64 5 50 100 150 200
    k_rg                      (tile_line, tile_sample, freq_sample) float64 0...
    k_az                      (freq_line) float64 -0.04409 -0.04251 ... 0.04409
    line                      (tile_line) int64 209 1280
    sample                    (tile_line, tile_sample) int64 1274 4661 ... 19158
    longitude                 (tile_line, tile_sample) float64 -156.1 ... -156.8
    latitude                  (tile_line, tile_sample) float64 22.1 ... 22.09
  * k_gp                      (k_gp) int64 1 2 3 4
  * phi_hf                    (phi_hf) int64 1 2 3 4 5
  * lambda_range_max_macs     (lambda_range_max_macs) float64 50.0 ... 275.0
Dimensions without coordinates: tile_sample, tile_line, 0tau, freq_line,
                                freq_sample, 1tau, 2tau, c_sample, c_line
Data variables: (12/27)
    incidence                 (tile_line, tile_sample) float64 31.21 ... 36.22
    ground_heading            (tile_line, tile_sample) float64 -168.9 ... -169.2
    burst                     (tile_line) int64 0 0
    sensing_time              (tile_line, tile_sample) datetime64[ns] 2022-05...
    sigma0                    (tile_line, tile_sample) float64 0.1109 ... 0.0...
    nesz                      (tile_line, tile_sample) float64 0.003995 ... 0...
    ...                        ...
    corner_line               (tile_line, c_line) int64 31 387 1102 1458
    corner_sample             (tile_line, tile_sample, c_sample) int64 718 .....
    burst_corner_longitude    (tile_line, c_sample, c_line) float64 -156.0 .....
    burst_corner_latitude     (tile_line, c_sample, c_line) float64 22.11 ......
    cwave_params              (tile_line, tile_sample, k_gp, phi_hf, 2tau) float64 ...
    macs                      (tile_line, tile_sample, lambda_range_max_macs, 2tau) complex128 ...
Attributes: (12/24)
    name:                   SENTINEL1_DS:/home/datawork-cersat-public/cache/p...
    short_name:             SENTINEL1_DS:S1A_IW_SLC__1SDV_20220507T162411_202...
    product:                SLC
    safe:                   S1A_IW_SLC__1SDV_20220507T162411_20220507T162439_...
    swath:                  IW
    multidataset:           False
    ...                     ...
    radar_frequency:        5405000454.33435
    azimuth_time_interval:  0.002055556299999998
    tile_width_sample:      5000.0
    tile_width_line:        5000.0
    tile_overlap_sample:    -10000.0
    tile_overlap_line:      -10000.0
[9]:
tile_line_i = 0
tile_sample_i = 0
onespec_without_IR = intra_xs_without_IR['xspectra_2tau'].isel({'tile_sample':tile_sample_i,'tile_line':tile_line_i}).squeeze()
onespec_without_IR = onespec_without_IR.swap_dims({'freq_line': 'k_az', 'freq_sample': 'k_rg'})
abs(onespec_without_IR.real.mean(dim='k_rg')).plot(label='real without IR')

onespec_with_IR = intra_xs_with_IR['xspectra_2tau'].isel({'tile_sample':tile_sample_i,'tile_line':tile_line_i}).squeeze()
onespec_with_IR = onespec_with_IR.swap_dims({'freq_line': 'k_az', 'freq_sample': 'k_rg'})
abs(onespec_with_IR.real.mean(dim='k_rg')).plot(label='real with IR')
plt.legend()
plt.grid(True)
../_images/examples_example_IW_compute_and_correct_from_impulse_response_14_0.png
[10]:
onespec_without_IR.imag.mean(dim='k_rg').plot(label='imag. without IR')
onespec_with_IR.imag.mean(dim='k_rg').plot(label='imag. with IR')
plt.legend()
plt.grid(True)
../_images/examples_example_IW_compute_and_correct_from_impulse_response_15_0.png