155 lines
4.0 KiB
Fortran
155 lines
4.0 KiB
Fortran
!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
|
|
|
|
|
|
|