subroutine bkfilter(n, y, up, dn, k, ybp)

! Aubhik 20.02.2005
!
! Baxter and King (1999) Band-Pass filter
!
! y is a data vector of length n
! ybp is the band pass filtered series, with 0.0 for the first and last k observations
! n is the length of the data vector y
! up is the lower frequency
!	for example, the business cycle band will have up = 6 for quarterly data
!	and up = 1.5 for annual data
! dn is the higher frequency
!	for example, the business cycle band will have dn = 32 for quarterly data
!	and dn = 8 for annual data
! k is the number of leads and lags used by the symmetric moving-average 
!	representation of the band pass filter.  Baxter and King (1999) find
!	that k = 12 is a practical choice.
! 
! Algorithm provided by Bob King.  This subroutine is the Fortran 90 version of 
! bpf.m and filtk.m written by Baxter and King (1999).  The band pass filter is 
! a moving average involving 2k+1 terms.  The weights are symmetric and calculated
! in akvec.  

implicit none

integer, parameter:: rk = selected_real_kind(15,307), ik = selected_int_kind(9)

integer(ik):: n, up, dn, k
real(rk):: y(n), ybp(n)

integer(ik):: j
real(rk):: pi, omlbar, omubar, kr, kj, theta
real(rk):: akvec(k+1), avec(2*k+1)

intent(in):: n, up, dn, k, y
intent(out):: ybp

pi = 2.0_rk*acos(0.0_rk)

omlbar = 2.0_rk*pi/dble(dn)
omubar = 2.0_rk*pi/dble(up)

akvec = 0.0_rk
avec = 0.0_rk

kr = dble(k)

akvec(1) = (omubar - omlbar)/pi

do j = 1, k
    kj = dble(j)
    akvec(j+1) = (dsin(kj*omubar) - dsin(kj*omlbar))/(kj*pi)
end do

theta = akvec(1) + 2.0_rk*sum(akvec(2:k+1))
theta = -1.0_rk*(theta/(2.0_rk*kr + 1.0_rk))

akvec = akvec + theta

avec(k+1) = akvec(1)

do j = 1, k
    avec(k+1 - j) = akvec(j+1)
    avec(k+1 + j) = akvec(j+1)
end do

ybp = 0.0_rk

do j = k + 1, n - k
    ybp(j) = dot_product(avec, y(j - k: j + k))
end do

end subroutine bkfilter