147 lines
5.2 KiB
Fortran
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
|
|
|
|
|