ISCE_INSAR/components/mroipac/icu/src/ph_sigma.F

147 lines
5.2 KiB
Fortran

!c****************************************************************
subroutine ph_sigma(intb, pslope, sline, eline, ssamp, esamp, winsz, sigma, sigma_cc)
!c****************************************************************
!c**
!c** FILE NAME: ph_sigma.f
!c**
!c** DATE WRITTEN: 5-Mar-98
!c**
!c** PROGRAMMER: Charles Werner
!c**
!c** FUNCTIONAL DESCRIPTION: Calculate phase standard deviation
!c** and effective correlation using phase gradient data.
!c**
!c** NOTES: none
!c**
!c** ROUTINES CALLED: none
!c**
!c** UPDATE LOG:
!c**
!c** Date Changed Reason Changed
!c** ------------ ----------------
!c** 1-Nov-98 v1.1 Corrected calculation of weighting function
!c** 1-Nov-98 v1.1 Corrected allocation of size of array sw to be fixed
!c** rather than a non-standard variable size
!c**
!c*****************************************************************
use icuState
implicit none
real*4 NLKS
parameter(NLKS=3) !looks used for estimation of correlation
!c INPUT VARIABLES:
complex*8 intb(0:infp%i_rsamps-1, 0:infp%i_azbufsize-1) !complex interferogram
complex*8 pslope(0:infp%i_rsamps-1, 0:infp%i_azbufsize-1) !phase gradients in packed format
integer*4 sline,eline !starting and ending line with valid data
integer*4 ssamp,esamp !starting and ending sample with valid data
integer*4 winsz !size of averaging window
!c OUTPUT VARIABLES:
real*4 sigma(0:infp%i_rsamps-1, 0:infp%i_azbufsize-1) !phase standard deviation
real*4 sigma_cc(0:infp%i_rsamps-1, 0:infp%i_azbufsize-1) !effective correlation coefficient
!c LOCAL VARIABLES:
complex sw(0:WIN_MAX-1,0:WIN_MAX-1) !complex deramped values
real*4 wf(0:WIN_MAX-1,0:WIN_MAX-1) !weighting function window
complex*8 xp !complex sum interf. window
complex*8 ex !complex exponential to deramp window
complex*8 sw1 !average phase shifted to 0.0 deg.
real*4 azph !azimuth phase ramp
real*4 ph !net range and azimuth phase ramp
real*4 s1 !sum of weights over window
real*4 ph_av !average phase over the window
real*4 ph2 !sum of squares for the phase data
real*4 ps !phase
real*4 wt !weighting factor
real*4 xpm !magnitude of the sum of samples in the region
real*4 r_slp !range phase slope
real*4 az_slp !azimuth phase slope
real*4 var !phase varienc
integer*4 i,j,k,n !loop indices
c PROCESSING STEPS:
s1=0.0 !initialize sum of weights
do k = 0 , winsz - 1 !generate window weighting function
do j = 0 , winsz - 1
wt = (k - winsz/2)**2 + (j - winsz/2)**2
wf(k,j) = exp(-wt/((winsz/2.0)))
s1 = s1 + wf(k,j)
end do
end do
do k = 0, winsz - 1
do j = 0, winsz - 1
wf(k,j) = wf(k,j)/s1 !normalize weights to sum to 1.0
end do
end do
c$doacross local(i,j,k,xp,az_slp,r_slp,azph,n,ph,ex,sw,xpm,
c$& ph_av,ph2,wt,sw1,ps,var),
c$& share(sline,eline,ssamp,esamp,winsz,pslope,wf,intb,sigma,sigma_cc)
do i = sline + winsz/2, eline - winsz/2 - 1 !azimuth loop -- trim edges
do j = ssamp + winsz/2, esamp - winsz/2 - 1 !range loop -- trim edges
xp = cmplx(0.0,0.0) !weighted and deramped sum
az_slp = aimag(pslope(j,i)) !azimuth phase slope
r_slp = real(pslope(j,i)) !range phase slope
do k = -winsz/2, winsz/2 !scan in azimuth over the estimation region
azph = k*az_slp !azimuth phase shift
do n = -winsz/2, winsz/2 !scan in range over the estimation region
ph = n*r_slp + azph !range phase shift + azimuth phase shift
ex = cmplx(cos(ph),-sin(ph)) !phase rotation vector
sw(n+winsz/2,k+winsz/2) = ex*intb(j+n,i+k) !save deramped interf. samples
xp = xp + sw(n+winsz/2, k+winsz/2) !sum the samples
end do
end do
xpm = cabs(xp) !magnitude of sum of deramped samples
if (xpm .gt. 0.0) then !check if non-zero data
xp = conjg(xp/xpm) !conjugate and normalize to unit magnitude
ph_av = 0.0 !initialize sum of phases
ph2 = 0.0 !initialize sum of squared phase values
do k= 0, winsz-1 !evaluate over the 2-D window
do n= 0, winsz-1
wt = wf(n,k) !window weighting function
sw1 = sw(n,k)*xp !remove phase offset
if(real(sw1) .ne. 0.0) then !check if non-zero data
ps = atan2(aimag(sw1),real(sw1)) !evaluate phase from complex
ph_av = ph_av + wt*ps !sum up weighted phase values
ph2 = ph2 + wt*(ps * ps) !sum up weighted squares of phase
end if
end do
end do
var = ph2 - ph_av*ph_av !phase variance
sigma(j,i) = sqrt(var) !phase standard deviation sigma
sigma_cc(j,i) = 1./sqrt(2.*NLKS*var + 1.) !effective correlation
else
sigma(j,i) = 0.0 !case for no data
sigma_cc(j,i) = 0.0
end if
end do
end do
return
end