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

155 lines
4.0 KiB
FortranFixed
Raw Normal View History

2019-01-16 19:40:08 +00:00
!c***************************************************************************
subroutine lowpass(c_in, c_out, sline, eline, ssamp, esamp, r_ranwin, r_azwin)
!c***************************************************************************
!c**
!c** FILE NAME: lowpass.f
!c**
!c** DATE WRITTEN: 6-Mar-97
!c**
!c** PROGRAMMER: Scott Hensley and Charles Werner
!c**
!c** FUNCTIONAL DESCRIPTION: This routine is a simple box car filter
!c** for complex data smoothing. Note fractional window sizes less than 3
!c** are allowed in which case a triangular weighting is used.
!c**
!c** ROUTINES CALLED:
!c**
!c** NOTES:
!c**
!c** UPDATE LOG:
!c**
!c** Date Changed Reason Changed CR # and Version #
!c** ------------ ---------------- -----------------
!c**
!c*****************************************************************
use icuState
implicit none
!c INPUT VARIABLES:
integer*4 sline,eline !starting and ending line with valid data
integer*4 ssamp,esamp !starting and ending sample with valid data
real*4 r_ranwin,r_azwin
complex*8 c_in(0:infp%i_rsamps-1, 0:infp%i_azbufsize-1)
complex*8, dimension(:,:), allocatable :: ctmp
!c OUTPUT VARIABLES:
complex*8 c_out(0:infp%i_rsamps-1, 0:infp%i_azbufsize-1)
!c LOCAL VARIABLES:
real*4 a
integer*4 ir,ia,mra,maz,i, i_first/1/
!c PROCESSING STEPS:
if (i_first .eq. 1) then
ALLOCATE ( ctmp(0:infp%i_rsamps-1, 0:infp%i_azbufsize-1) )
i_first = 0
end if
if (r_ranwin .ge. 3.0) then
mra = int(r_ranwin/2)*2 + 1 !forces window size to be odd
do ia = sline, eline
do ir = ssamp, ssamp+mra/2-1
ctmp(ir,ia) = cmplx(0.,0.)
do i = max(ssamp, ir-mra/2-1),min(esamp,ir+mra/2-1)
ctmp(ir,ia) = ctmp(ir,ia) + c_in(i,ia)
end do
end do
do ir = ssamp+mra/2, esamp-mra/2-1
ctmp(ir,ia) = c_in(ir-mra/2,ia)
end do
do i = 1,mra-1
do ir = ssamp+mra/2, esamp-mra/2-1
ctmp(ir,ia) = ctmp(ir,ia) + c_in(ir-mra/2-1+i,ia)
end do
end do
do ir = esamp-mra/2, esamp
ctmp(ir,ia) = cmplx(0.,0.)
do i = max(ssamp, ir-mra/2-1), min(esamp,ir+mra/2-1)
ctmp(ir,ia) = ctmp(ir,ia) + c_in(i,ia)
end do
end do
end do
else if (r_ranwin .le. 1.1) then
do ia = sline, eline
do ir = ssamp,esamp
ctmp(ir,ia) = c_in(ir,ia)
end do
end do
else
a = 0.5*(r_ranwin - 1)
do ia = sline, eline
do ir = ssamp+1, esamp-1
ctmp(ir,ia) = c_in(ir,ia) + a*(c_in(ir-1,ia) + c_in(ir+1,ia))
end do
ctmp(ssamp,ia) = c_in(ssamp,ia)
ctmp(esamp,ia) = c_in(esamp,ia)
end do
endif
!c azimuth filtering
if (r_azwin .ge. 3.0) then
maz = int(r_azwin/2)*2 + 1
do ia = sline, eline
i = max(sline, ia-maz/2)
do ir = ssamp, esamp
c_out(ir,ia) = ctmp(ir,i)
end do
do i = max(sline, ia-maz/2), min(eline, ia+maz/2)
do ir = ssamp, esamp
c_out(ir,ia) = c_out(ir,ia) + ctmp(ir,i)
end do
end do
end do
else if (r_azwin .le. 1.1) then
do ia = sline, eline
do ir = ssamp, esamp
c_out(ir,ia) = ctmp(ir,ia)
end do
end do
else
a = 0.5*(r_azwin - 1)
do ia = sline+1, eline-1
do ir = ssamp, esamp
c_out(ir,ia) = ctmp(ir,ia) + a*(ctmp(ir,ia-1) + ctmp(ir,ia+1))
end do
end do
do ir = ssamp, esamp
c_out(ir,0) = ctmp(ir,0)
c_out(ir,eline) = ctmp(ir,eline)
end do
endif
end