2019-01-16 19:40:08 +00:00
|
|
|
#
|
|
|
|
# Author: Heresh Fattahi
|
|
|
|
# Copyright 2017
|
|
|
|
#
|
|
|
|
import logging
|
|
|
|
import isceobj
|
|
|
|
from contrib.splitSpectrum import SplitRangeSpectrum as splitSpectrum
|
|
|
|
import numpy as np
|
|
|
|
import os
|
|
|
|
from isceobj.Constants import SPEED_OF_LIGHT
|
|
|
|
import time
|
|
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger('isce.insar.runSplitSpectrum')
|
|
|
|
|
|
|
|
def split(fullBandSlc, lowBandSlc, highBandSlc, fs, bL, bH, fL, fH):
|
|
|
|
|
|
|
|
ss = splitSpectrum()
|
|
|
|
|
|
|
|
ss.blocksize = 100
|
|
|
|
ss.memsize = 512
|
|
|
|
ss.inputDS = fullBandSlc + ".vrt"
|
|
|
|
ss.lbDS = lowBandSlc
|
|
|
|
ss.hbDS = highBandSlc
|
|
|
|
ss.rangeSamplingRate = fs
|
|
|
|
ss.lowBandWidth = bL
|
|
|
|
ss.highBandWidth = bH
|
|
|
|
ss.lowCenterFrequency = fL
|
|
|
|
ss.highCenterFrequency = fH
|
|
|
|
|
|
|
|
ss.split()
|
|
|
|
|
|
|
|
def createSlcImage(slcName, width):
|
|
|
|
|
|
|
|
slc = isceobj.createSlcImage()
|
|
|
|
slc.setWidth(width)
|
|
|
|
slc.filename = slcName
|
|
|
|
slc.setAccessMode('write')
|
|
|
|
slc.renderHdr()
|
|
|
|
|
|
|
|
|
|
|
|
def adjustCenterFrequency(B, N, dc):
|
|
|
|
|
|
|
|
# because of quantization, there may not be an index representing dc. We
|
|
|
|
# therefore adjust dc to make sure that there is an index to represent it.
|
|
|
|
# We find the index that is closest to nominal dc and then adjust dc to the
|
|
|
|
# frequency of that index.
|
|
|
|
# B = full band-width
|
|
|
|
# N = length of signal
|
|
|
|
# dc = center frequency of the sub-band
|
|
|
|
|
|
|
|
df = B/N
|
|
|
|
if (dc < 0):
|
|
|
|
ind = N + np.round(dc/df)
|
|
|
|
|
|
|
|
else:
|
|
|
|
ind = np.round(dc/df);
|
|
|
|
|
|
|
|
dc = frequency (B, N, ind)
|
|
|
|
|
|
|
|
return dc
|
|
|
|
|
|
|
|
|
|
|
|
def frequency (B, N, n):
|
|
|
|
# calculates frequency at a given index.
|
|
|
|
# Assumption: for indices 0 to (N-1)/2, frequency is positive
|
|
|
|
# and for indices larger than (N-1)/2 frequency is negative
|
|
|
|
|
|
|
|
#frequency interval given B as the total bandwidth
|
|
|
|
df = B/N
|
|
|
|
middleIndex = int((N-1)/2)
|
|
|
|
|
|
|
|
if (n > middleIndex):
|
|
|
|
f = (n-N)*df
|
|
|
|
|
|
|
|
else:
|
|
|
|
f = n*df
|
|
|
|
|
|
|
|
return f
|
|
|
|
|
|
|
|
|
|
|
|
def runSplitSpectrum(self):
|
|
|
|
'''
|
|
|
|
Generate split spectrum SLCs.
|
|
|
|
'''
|
|
|
|
|
|
|
|
if not self.doSplitSpectrum:
|
|
|
|
print('Split spectrum processing not requested. Skipping ....')
|
|
|
|
return
|
|
|
|
|
|
|
|
masterFrame = self._insar.loadProduct( self._insar.masterSlcCropProduct)
|
|
|
|
slaveFrame = self._insar.loadProduct( self._insar.slaveSlcCropProduct)
|
|
|
|
|
|
|
|
masterSlc = masterFrame.getImage().filename
|
|
|
|
slaveSlc = slaveFrame.getImage().filename
|
|
|
|
|
|
|
|
width1 = masterFrame.getImage().getWidth()
|
|
|
|
width2 = slaveFrame.getImage().getWidth()
|
|
|
|
|
|
|
|
fs_master = masterFrame.rangeSamplingRate
|
|
|
|
pulseLength_master = masterFrame.instrument.pulseLength
|
|
|
|
chirpSlope_master = masterFrame.instrument.chirpSlope
|
|
|
|
|
|
|
|
#Bandwidth
|
|
|
|
B_master = np.abs(chirpSlope_master)*pulseLength_master
|
|
|
|
|
|
|
|
fs_slave = slaveFrame.rangeSamplingRate
|
|
|
|
pulseLength_slave = slaveFrame.instrument.pulseLength
|
|
|
|
chirpSlope_slave = slaveFrame.instrument.chirpSlope
|
|
|
|
|
|
|
|
#Bandwidth
|
|
|
|
B_slave = np.abs(chirpSlope_slave)*pulseLength_slave
|
|
|
|
|
|
|
|
print("master image range sampling rate: {0} MHz".format(fs_master/(1.0e6)))
|
|
|
|
print("slave image range sampling rate: {0} MHz".format(fs_slave/(1.0e6)))
|
|
|
|
|
|
|
|
|
|
|
|
print("master image total range bandwidth: {0} MHz".format(B_master/(1.0e6)))
|
|
|
|
print("slave image total range bandwidth: {0} MHz".format(B_slave/(1.0e6)))
|
|
|
|
|
|
|
|
|
|
|
|
# If the bandwidth of master and slave are different, choose the smaller bandwidth
|
|
|
|
# for range split spectrum
|
|
|
|
B = np.min([B_slave, B_master])
|
|
|
|
print("Bandwidth used for split spectrum: {0} MHz".format(B/(1.e6)))
|
|
|
|
|
|
|
|
# Dividing the total bandwidth of B to three bands and consider the sub bands on
|
|
|
|
# the most left and right hand side as the spectrum of low band and high band SLCs
|
|
|
|
|
|
|
|
# band width of the low-band
|
|
|
|
bL = B/3.0
|
|
|
|
|
|
|
|
# band width of the high-band
|
|
|
|
bH = B/3.0
|
|
|
|
|
|
|
|
# center frequency of the low-band
|
|
|
|
fL = -1.0*B/3.0
|
|
|
|
|
|
|
|
# center frequency of the high-band
|
|
|
|
fH = B/3.0
|
|
|
|
|
|
|
|
lowBandDir = os.path.join(self.insar.splitSpectrumDirname, self.insar.lowBandSlcDirname)
|
|
|
|
highBandDir = os.path.join(self.insar.splitSpectrumDirname, self.insar.highBandSlcDirname)
|
|
|
|
|
2020-04-13 19:40:32 +00:00
|
|
|
os.makedirs(lowBandDir, exist_ok=True)
|
|
|
|
os.makedirs(highBandDir, exist_ok=True)
|
2019-01-16 19:40:08 +00:00
|
|
|
|
|
|
|
masterLowBandSlc = os.path.join(lowBandDir, os.path.basename(masterSlc))
|
|
|
|
masterHighBandSlc = os.path.join(highBandDir, os.path.basename(masterSlc))
|
|
|
|
|
|
|
|
slaveLowBandSlc = os.path.join(lowBandDir, os.path.basename(slaveSlc))
|
|
|
|
slaveHighBandSlc = os.path.join(highBandDir, os.path.basename(slaveSlc))
|
|
|
|
|
|
|
|
radarWavelength = masterFrame.radarWavelegth
|
|
|
|
|
|
|
|
print("deviation of low-band's center frequency from full-band's center frequency: {0} MHz".format(fL/1.0e6))
|
|
|
|
|
|
|
|
print("deviation of high-band's center frequency from full-band's center frequency: {0} MHz".format(fH/1.0e6))
|
|
|
|
|
|
|
|
print("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%")
|
|
|
|
print("splitting the range-spectrum of master SLC")
|
|
|
|
split(masterSlc, masterLowBandSlc, masterHighBandSlc, fs_master, bL, bH, fL, fH)
|
|
|
|
print("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%")
|
|
|
|
print("splitting the range-spectrum of slave SLC")
|
|
|
|
split(slaveSlc, slaveLowBandSlc, slaveHighBandSlc, fs_slave, bL, bH, fL, fH)
|
|
|
|
########################
|
|
|
|
|
|
|
|
createSlcImage(masterLowBandSlc, width1)
|
|
|
|
createSlcImage(masterHighBandSlc, width1)
|
|
|
|
createSlcImage(slaveLowBandSlc, width2)
|
|
|
|
createSlcImage(slaveHighBandSlc, width2)
|
|
|
|
|
|
|
|
########################
|
|
|
|
|
|
|
|
f0 = SPEED_OF_LIGHT/radarWavelength
|
|
|
|
fH = f0 + fH
|
|
|
|
fL = f0 + fL
|
|
|
|
wavelengthL = SPEED_OF_LIGHT/fL
|
|
|
|
wavelengthH = SPEED_OF_LIGHT/fH
|
|
|
|
|
|
|
|
self.insar.lowBandRadarWavelength = wavelengthL
|
|
|
|
self.insar.highBandRadarWavelength = wavelengthH
|
|
|
|
|
|
|
|
self.insar.lowBandSlc1 = masterLowBandSlc
|
|
|
|
self.insar.lowBandSlc2 = slaveLowBandSlc
|
|
|
|
|
|
|
|
self.insar.highBandSlc1 = masterHighBandSlc
|
|
|
|
self.insar.highBandSlc2 = slaveHighBandSlc
|
|
|
|
|
|
|
|
########################
|
|
|
|
|
|
|
|
|