parent
2637bb6a9e
commit
fd28d2e126
|
@ -755,146 +755,3 @@ def reformatMaskedAreas(maskedAreas, length, width):
|
||||||
return maskedAreasReformated
|
return maskedAreasReformated
|
||||||
|
|
||||||
|
|
||||||
########################################################################################################
|
|
||||||
# The following functions are not used anywhere, and can be deleted.
|
|
||||||
########################################################################################################
|
|
||||||
|
|
||||||
def fit_surface(x, y, z, wgt, order):
|
|
||||||
# x: x coordinate, a column vector
|
|
||||||
# y: y coordinate, a column vector
|
|
||||||
# z: z coordinate, a column vector
|
|
||||||
# wgt: weight of the data points, a column vector
|
|
||||||
|
|
||||||
|
|
||||||
#number of data points
|
|
||||||
m = x.shape[0]
|
|
||||||
l = np.ones((m,1), dtype=np.float64)
|
|
||||||
|
|
||||||
# #create polynomial
|
|
||||||
# if order == 1:
|
|
||||||
# #order of estimated coefficents: 1, x, y
|
|
||||||
# a1 = np.concatenate((l, x, y), axis=1)
|
|
||||||
# elif order == 2:
|
|
||||||
# #order of estimated coefficents: 1, x, y, x*y, x**2, y**2
|
|
||||||
# a1 = np.concatenate((l, x, y, x*y, x**2, y**2), axis=1)
|
|
||||||
# elif order == 3:
|
|
||||||
# #order of estimated coefficents: 1, x, y, x*y, x**2, y**2, x**2*y, y**2*x, x**3, y**3
|
|
||||||
# a1 = np.concatenate((l, x, y, x*y, x**2, y**2, x**2*y, y**2*x, x**3, y**3), axis=1)
|
|
||||||
# else:
|
|
||||||
# raise Exception('order not supported yet\n')
|
|
||||||
|
|
||||||
if order < 1:
|
|
||||||
raise Exception('order must be larger than 1.\n')
|
|
||||||
|
|
||||||
#create polynomial
|
|
||||||
a1 = l;
|
|
||||||
for i in range(1, order+1):
|
|
||||||
for j in range(i+1):
|
|
||||||
a1 = np.concatenate((a1, x**(i-j)*y**(j)), axis=1)
|
|
||||||
|
|
||||||
#number of variable to be estimated
|
|
||||||
n = a1.shape[1]
|
|
||||||
|
|
||||||
#do the least squares
|
|
||||||
a = a1 * np.matlib.repmat(np.sqrt(wgt), 1, n)
|
|
||||||
b = z * np.sqrt(wgt)
|
|
||||||
c = np.linalg.lstsq(a, b, rcond=-1)[0]
|
|
||||||
|
|
||||||
#type: <class 'numpy.ndarray'>
|
|
||||||
return c
|
|
||||||
|
|
||||||
|
|
||||||
def cal_surface(x, y, c, order):
|
|
||||||
#x: x coordinate, a row vector
|
|
||||||
#y: y coordinate, a column vector
|
|
||||||
#c: coefficients of polynomial from fit_surface
|
|
||||||
#order: order of polynomial
|
|
||||||
|
|
||||||
if order < 1:
|
|
||||||
raise Exception('order must be larger than 1.\n')
|
|
||||||
|
|
||||||
#number of lines
|
|
||||||
length = y.shape[0]
|
|
||||||
#number of columns, if row vector, only one element in the shape tuple
|
|
||||||
#width = x.shape[1]
|
|
||||||
width = x.shape[0]
|
|
||||||
|
|
||||||
x = np.matlib.repmat(x, length, 1)
|
|
||||||
y = np.matlib.repmat(y, 1, width)
|
|
||||||
z = c[0] * np.ones((length,width), dtype=np.float64)
|
|
||||||
|
|
||||||
index = 0
|
|
||||||
for i in range(1, order+1):
|
|
||||||
for j in range(i+1):
|
|
||||||
index += 1
|
|
||||||
z += c[index] * x**(i-j)*y**(j)
|
|
||||||
|
|
||||||
return z
|
|
||||||
|
|
||||||
|
|
||||||
def weight_fitting(ionos, weight, width, length, nrli, nali, nrlo, nalo, order):
|
|
||||||
'''
|
|
||||||
ionos: input ionospheric phase
|
|
||||||
weight: weight
|
|
||||||
width: file width
|
|
||||||
length: file length
|
|
||||||
nrli: number of range looks of the input interferograms
|
|
||||||
nali: number of azimuth looks of the input interferograms
|
|
||||||
nrlo: number of range looks of the output ionosphere phase
|
|
||||||
nalo: number of azimuth looks of the ioutput ionosphere phase
|
|
||||||
order: the order of the polynomial for fitting ionosphere phase estimates
|
|
||||||
'''
|
|
||||||
|
|
||||||
from isceobj.Alos2Proc.Alos2ProcPublic import create_multi_index2
|
|
||||||
|
|
||||||
lengthi = int(length/nali)
|
|
||||||
widthi = int(width/nrli)
|
|
||||||
lengtho = int(length/nalo)
|
|
||||||
widtho = int(width/nrlo)
|
|
||||||
|
|
||||||
#calculate output index
|
|
||||||
rgindex = create_multi_index2(widtho, nrli, nrlo)
|
|
||||||
azindex = create_multi_index2(lengtho, nali, nalo)
|
|
||||||
|
|
||||||
#look for data to use
|
|
||||||
flag = (weight!=0)*(ionos!=0)
|
|
||||||
point_index = np.nonzero(flag)
|
|
||||||
m = point_index[0].shape[0]
|
|
||||||
|
|
||||||
#calculate input index matrix
|
|
||||||
x0=np.matlib.repmat(np.arange(widthi), lengthi, 1)
|
|
||||||
y0=np.matlib.repmat(np.arange(lengthi).reshape(lengthi, 1), 1, widthi)
|
|
||||||
|
|
||||||
x = x0[point_index].reshape(m, 1)
|
|
||||||
y = y0[point_index].reshape(m, 1)
|
|
||||||
z = ionos[point_index].reshape(m, 1)
|
|
||||||
w = weight[point_index].reshape(m, 1)
|
|
||||||
|
|
||||||
#convert to higher precision type before use
|
|
||||||
x=np.asfarray(x,np.float64)
|
|
||||||
y=np.asfarray(y,np.float64)
|
|
||||||
z=np.asfarray(z,np.float64)
|
|
||||||
w=np.asfarray(w,np.float64)
|
|
||||||
coeff = fit_surface(x, y, z, w, order)
|
|
||||||
|
|
||||||
#convert to higher precision type before use
|
|
||||||
rgindex=np.asfarray(rgindex,np.float64)
|
|
||||||
azindex=np.asfarray(azindex,np.float64)
|
|
||||||
phase_fit = cal_surface(rgindex, azindex.reshape(lengtho, 1), coeff, order)
|
|
||||||
|
|
||||||
#format: widtho, lengtho, single band float32
|
|
||||||
return phase_fit
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue