blob: af529e3b754539e8f24db121bf444de2e0be6c88 [file] [log] [blame]
! Fast Fourier/Cosine/Sine Transform
! dimension :two
! data length :power of 2
! decimation :frequency
! radix :4, 2, row-column
! data :inplace
! table :use
! subroutines
! cdft2d: Complex Discrete Fourier Transform
! rdft2d: Real Discrete Fourier Transform
! ddct2d: Discrete Cosine Transform
! ddst2d: Discrete Sine Transform
!
!
! -------- Complex DFT (Discrete Fourier Transform) --------
! [definition]
! <case1>
! X(k1,k2) = sum_j1=0^n1-1 sum_j2=0^n2-1 x(j1,j2) *
! exp(2*pi*i*j1*k1/n1) *
! exp(2*pi*i*j2*k2/n2),
! 0<=k1<n1, 0<=k2<n2
! <case2>
! X(k1,k2) = sum_j1=0^n1-1 sum_j2=0^n2-1 x(j1,j2) *
! exp(-2*pi*i*j1*k1/n1) *
! exp(-2*pi*i*j2*k2/n2),
! 0<=k1<n1, 0<=k2<n2
! (notes: sum_j=0^n-1 is a summation from j=0 to n-1)
! [usage]
! <case1>
! ip(0) = 0 ! first time only
! call cdft2d(n1max, 2*n1, n2, 1, a, ip, w)
! <case2>
! ip(0) = 0 ! first time only
! call cdft2d(n1max, 2*n1, n2, -1, a, ip, w)
! [parameters]
! n1max :row size of the 2D array (integer)
! 2*n1 :data length (integer)
! n1 >= 1, n1 = power of 2
! n2 :data length (integer)
! n2 >= 1, n2 = power of 2
! a(0:2*n1-1,0:n2-1)
! :input/output data (real*8)
! input data
! a(2*j1,j2) = Re(x(j1,j2)),
! a(2*j1+1,j2) = Im(x(j1,j2)),
! 0<=j1<n1, 0<=j2<n2
! output data
! a(2*k1,k2) = Re(X(k1,k2)),
! a(2*k1+1,k2) = Im(X(k1,k2)),
! 0<=k1<n1, 0<=k2<n2
! ip(0:*):work area for bit reversal (integer)
! length of ip >= 2+sqrt(n)
! (n = max(n1, n2))
! ip(0),ip(1) are pointers of the cos/sin table.
! w(0:*) :cos/sin table (real*8)
! length of w >= max(n1/2, n2/2)
! w(),ip() are initialized if ip(0) = 0.
! [remark]
! Inverse of
! call cdft2d(n1max, 2*n1, n2, -1, a, ip, w)
! is
! call cdft2d(n1max, 2*n1, n2, 1, a, ip, w)
! do j2 = 0, n2 - 1
! do j1 = 0, 2 * n1 - 1
! a(j1, j2) = a(j1, j2) * (1.0d0 / (n1 * n2))
! end do
! end do
! .
!
!
! -------- Real DFT / Inverse of Real DFT --------
! [definition]
! <case1> RDFT
! R(k1,k2) = sum_j1=0^n1-1 sum_j2=0^n2-1 a(j1,j2) *
! cos(2*pi*j1*k1/n1 + 2*pi*j2*k2/n2),
! 0<=k1<n1, 0<=k2<n2
! I(k1,k2) = sum_j1=0^n1-1 sum_j2=0^n2-1 a(j1,j2) *
! sin(2*pi*j1*k1/n1 + 2*pi*j2*k2/n2),
! 0<=k1<n1, 0<=k2<n2
! <case2> IRDFT (excluding scale)
! a(k1,k2) = (1/2) * sum_j1=0^n1-1 sum_j2=0^n2-1
! (R(j1,j2) *
! cos(2*pi*j1*k1/n1 + 2*pi*j2*k2/n2) +
! I(j1,j2) *
! sin(2*pi*j1*k1/n1 + 2*pi*j2*k2/n2)),
! 0<=k1<n1, 0<=k2<n2
! (notes: R(n1-k1,n2-k2) = R(k1,k2),
! I(n1-k1,n2-k2) = -I(k1,k2),
! R(n1-k1,0) = R(k1,0),
! I(n1-k1,0) = -I(k1,0),
! R(0,n2-k2) = R(0,k2),
! I(0,n2-k2) = -I(0,k2),
! 0<k1<n1, 0<k2<n2)
! [usage]
! <case1>
! ip(0) = 0 ! first time only
! call rdft2d(n1max, n1, n2, 1, a, ip, w)
! <case2>
! ip(0) = 0 ! first time only
! call rdft2d(n1max, n1, n2, -1, a, ip, w)
! [parameters]
! n1max :row size of the 2D array (integer)
! n1 :data length (integer)
! n1 >= 2, n1 = power of 2
! n2 :data length (integer)
! n2 >= 2, n2 = power of 2
! a(0:n1-1,0:n2-1)
! :input/output data (real*8)
! <case1>
! output data
! a(2*k1,k2) = R(k1,k2) = R(n1-k1,n2-k2),
! a(2*k1+1,k2) = I(k1,k2) = -I(n1-k1,n2-k2),
! 0<k1<n1/2, 0<k2<n2,
! a(2*k1,0) = R(k1,0) = R(n1-k1,0),
! a(2*k1+1,0) = I(k1,0) = -I(n1-k1,0),
! 0<k1<n1/2,
! a(0,k2) = R(0,k2) = R(0,n2-k2),
! a(1,k2) = I(0,k2) = -I(0,n2-k2),
! a(1,n2-k2) = R(n1/2,k2) = R(n1/2,n2-k2),
! a(0,n2-k2) = -I(n1/2,k2) = I(n1/2,n2-k2),
! 0<k2<n2/2,
! a(0,0) = R(0,0),
! a(1,0) = R(n1/2,0),
! a(0,n2/2) = R(0,n2/2),
! a(1,n2/2) = R(n1/2,n2/2)
! <case2>
! input data
! a(2*j1,j2) = R(j1,j2) = R(n1-j1,n2-j2),
! a(2*j1+1,j2) = I(j1,j2) = -I(n1-j1,n2-j2),
! 0<j1<n1/2, 0<j2<n2,
! a(2*j1,0) = R(j1,0) = R(n1-j1,0),
! a(2*j1+1,0) = I(j1,0) = -I(n1-j1,0),
! 0<j1<n1/2,
! a(0,j2) = R(0,j2) = R(0,n2-j2),
! a(1,j2) = I(0,j2) = -I(0,n2-j2),
! a(1,n2-j2) = R(n1/2,j2) = R(n1/2,n2-j2),
! a(0,n2-j2) = -I(n1/2,j2) = I(n1/2,n2-j2),
! 0<j2<n2/2,
! a(0,0) = R(0,0),
! a(1,0) = R(n1/2,0),
! a(0,n2/2) = R(0,n2/2),
! a(1,n2/2) = R(n1/2,n2/2)
! ip(0:*):work area for bit reversal (integer)
! length of ip >= 2+sqrt(n)
! (n = max(n1/2, n2))
! ip(0),ip(1) are pointers of the cos/sin table.
! w(0:*) :cos/sin table (real*8)
! length of w >= max(n1/4, n2/2) + n1/4
! w(),ip() are initialized if ip(0) = 0.
! [remark]
! Inverse of
! call rdft2d(n1max, n1, n2, 1, a, ip, w)
! is
! call rdft2d(n1max, n1, n2, -1, a, ip, w)
! do j2 = 0, n2 - 1
! do j1 = 0, n1 - 1
! a(j1, j2) = a(j1, j2) * (2.0d0 / (n1 * n2))
! end do
! end do
! .
!
!
! -------- DCT (Discrete Cosine Transform) / Inverse of DCT --------
! [definition]
! <case1> IDCT (excluding scale)
! C(k1,k2) = sum_j1=0^n1-1 sum_j2=0^n2-1 a(j1,j2) *
! cos(pi*j1*(k1+1/2)/n1) *
! cos(pi*j2*(k2+1/2)/n2),
! 0<=k1<n1, 0<=k2<n2
! <case2> DCT
! C(k1,k2) = sum_j1=0^n1-1 sum_j2=0^n2-1 a(j1,j2) *
! cos(pi*(j1+1/2)*k1/n1) *
! cos(pi*(j2+1/2)*k2/n2),
! 0<=k1<n1, 0<=k2<n2
! [usage]
! <case1>
! ip(0) = 0 ! first time only
! call ddct2d(n1max, n1, n2, 1, a, t, ip, w)
! <case2>
! ip(0) = 0 ! first time only
! call ddct2d(n1max, n1, n2, -1, a, t, ip, w)
! [parameters]
! n1max :row size of the 2D array (integer)
! n1 :data length (integer)
! n1 >= 2, n1 = power of 2
! n2 :data length (integer)
! n2 >= 2, n2 = power of 2
! a(0:n1-1,0:n2-1)
! :input/output data (real*8)
! output data
! a(k1,k2) = C(k1,k2), 0<=k1<n1, 0<=k2<n2
! t(0:n1-1,0:n2-1)
! :work area (real*8)
! ip(0:*):work area for bit reversal (integer)
! length of ip >= 2+sqrt(n)
! (n = max(n1/2, n2))
! ip(0),ip(1) are pointers of the cos/sin table.
! w(0:*) :cos/sin table (real*8)
! length of w >= max(n1/4, n2/2) + max(n1, n2)
! w(),ip() are initialized if ip(0) = 0.
! [remark]
! Inverse of
! call ddct2d(n1max, n1, n2, -1, a, t, ip, w)
! is
! do j1 = 0, n1 - 1
! a(j1, 0) = a(j1, 0) * 0.5d0
! end do
! do j2 = 0, n2 - 1
! a(0, j2) = a(0, j2) * 0.5d0
! end do
! call ddct2d(n1max, n1, n2, 1, a, t, ip, w)
! do j2 = 0, n2 - 1
! do j1 = 0, n1 - 1
! a(j1, j2) = a(j1, j2) * (4.0d0 / (n1 * n2))
! end do
! end do
! .
!
!
! -------- DST (Discrete Sine Transform) / Inverse of DST --------
! [definition]
! <case1> IDST (excluding scale)
! S(k1,k2) = sum_j1=1^n1 sum_j2=1^n2 A(j1,j2) *
! sin(pi*j1*(k1+1/2)/n1) *
! sin(pi*j2*(k2+1/2)/n2),
! 0<=k1<n1, 0<=k2<n2
! <case2> DST
! S(k1,k2) = sum_j1=0^n1-1 sum_j2=0^n2-1 a(j1,j2) *
! sin(pi*(j1+1/2)*k1/n1) *
! sin(pi*(j2+1/2)*k2/n2),
! 0<k1<=n1, 0<k2<=n2
! [usage]
! <case1>
! ip(0) = 0 ! first time only
! call ddst2d(n1max, n1, n2, 1, a, t, ip, w)
! <case2>
! ip(0) = 0 ! first time only
! call ddst2d(n1max, n1, n2, -1, a, t, ip, w)
! [parameters]
! n1max :row size of the 2D array (integer)
! n1 :data length (integer)
! n1 >= 2, n1 = power of 2
! n2 :data length (integer)
! n2 >= 2, n2 = power of 2
! a(0:n1-1,0:n2-1)
! :input/output data (real*8)
! <case1>
! input data
! a(j1,j2) = A(j1,j2), 0<j1<n1, 0<j2<n2,
! a(j1,0) = A(j1,n2), 0<j1<n1,
! a(0,j2) = A(n1,j2), 0<j2<n2,
! a(0,0) = A(n1,n2)
! (i.e. A(j1,j2) = a(mod(j1,n1),mod(j2,n2)))
! output data
! a(k1,k2) = S(k1,k2), 0<=k1<n1, 0<=k2<n2
! <case2>
! output data
! a(k1,k2) = S(k1,k2), 0<k1<n1, 0<k2<n2,
! a(k1,0) = S(k1,n2), 0<k1<n1,
! a(0,k2) = S(n1,k2), 0<k2<n2,
! a(0,0) = S(n1,n2)
! (i.e. S(k1,k2) = a(mod(k1,n1),mod(k2,n2)))
! t(0:n1-1,0:n2-1)
! :work area (real*8)
! ip(0:*):work area for bit reversal (integer)
! length of ip >= 2+sqrt(n)
! (n = max(n1/2, n2))
! ip(0),ip(1) are pointers of the cos/sin table.
! w(0:*) :cos/sin table (real*8)
! length of w >= max(n1/4, n2/2) + max(n1, n2)
! w(),ip() are initialized if ip(0) = 0.
! [remark]
! Inverse of
! call ddst2d(n1max, n1, n2, -1, a, t, ip, w)
! is
! do j1 = 0, n1 - 1
! a(j1, 0) = a(j1, 0) * 0.5d0
! end do
! do j2 = 0, n2 - 1
! a(0, j2) = a(0, j2) * 0.5d0
! end do
! call ddst2d(n1max, n1, n2, 1, a, t, ip, w)
! do j2 = 0, n2 - 1
! do j1 = 0, n1 - 1
! a(j1, j2) = a(j1, j2) * (4.0d0 / (n1 * n2))
! end do
! end do
! .
!
!
subroutine cdft2d(n1max, n1, n2, isgn, a, ip, w)
integer n1max, n1, n2, isgn, ip(0 : *), n
real*8 a(0 : n1max - 1, 0 : n2 - 1), w(0 : *)
n = max(n1, 2 * n2)
if (n .gt. 4 * ip(0)) then
call makewt(n / 4, ip, w)
end if
if (n1 .gt. 4) then
call bitrv2row(n1max, n1, n2, ip(2), a)
end if
if (n2 .gt. 2) then
call bitrv2col(n1max, n1, n2, ip(2), a)
end if
if (isgn .lt. 0) then
call cftfrow(n1max, n1, n2, a, w)
call cftfcol(n1max, n1, n2, a, w)
else
call cftbrow(n1max, n1, n2, a, w)
call cftbcol(n1max, n1, n2, a, w)
end if
end
!
subroutine rdft2d(n1max, n1, n2, isgn, a, ip, w)
integer n1max, n1, n2, isgn, ip(0 : *), n, nw, nc, n2h, i, j
real*8 a(0 : n1max - 1, 0 : n2 - 1), w(0 : *), xi
n = max(n1, 2 * n2)
nw = ip(0)
if (n .gt. 4 * nw) then
nw = n / 4
call makewt(nw, ip, w)
end if
nc = ip(1)
if (n1 .gt. 4 * nc) then
nc = n1 / 4
call makect(nc, ip, w(nw))
end if
n2h = n2 / 2
if (isgn .lt. 0) then
do i = 1, n2h - 1
j = n2 - i
xi = a(0, i) - a(0, j)
a(0, i) = a(0, i) + a(0, j)
a(0, j) = xi
xi = a(1, j) - a(1, i)
a(1, i) = a(1, i) + a(1, j)
a(1, j) = xi
end do
if (n2 .gt. 2) then
call bitrv2col(n1max, n1, n2, ip(2), a)
end if
call cftfcol(n1max, n1, n2, a, w)
do i = 0, n2 - 1
a(1, i) = 0.5d0 * (a(0, i) - a(1, i))
a(0, i) = a(0, i) - a(1, i)
end do
if (n1 .gt. 4) then
call rftfrow(n1max, n1, n2, a, nc, w(nw))
call bitrv2row(n1max, n1, n2, ip(2), a)
end if
call cftfrow(n1max, n1, n2, a, w)
else
if (n1 .gt. 4) then
call bitrv2row(n1max, n1, n2, ip(2), a)
end if
call cftbrow(n1max, n1, n2, a, w)
if (n1 .gt. 4) then
call rftbrow(n1max, n1, n2, a, nc, w(nw))
end if
do i = 0, n2 - 1
xi = a(0, i) - a(1, i)
a(0, i) = a(0, i) + a(1, i)
a(1, i) = xi
end do
if (n2 .gt. 2) then
call bitrv2col(n1max, n1, n2, ip(2), a)
end if
call cftbcol(n1max, n1, n2, a, w)
do i = 1, n2h - 1
j = n2 - i
a(0, j) = 0.5d0 * (a(0, i) - a(0, j))
a(0, i) = a(0, i) - a(0, j)
a(1, j) = 0.5d0 * (a(1, i) + a(1, j))
a(1, i) = a(1, i) - a(1, j)
end do
end if
end
!
subroutine ddct2d(n1max, n1, n2, isgn, a, t, ip, w)
integer n1max, n1, n2, isgn, ip(0 : *), n, nw, nc, n1h, n2h,
& i, ix, ic, j, jx, jc
real*8 a(0 : n1max - 1, 0 : n2 - 1),
& t(0 : n1max - 1, 0 : n2 - 1), w(0 : *), xi
n = max(n1, 2 * n2)
nw = ip(0)
if (n .gt. 4 * nw) then
nw = n / 4
call makewt(nw, ip, w)
end if
nc = ip(1)
if (n1 .gt. nc .or. n2 .gt. nc) then
nc = max(n1, n2)
call makect(nc, ip, w(nw))
end if
n1h = n1 / 2
n2h = n2 / 2
if (isgn .ge. 0) then
do i = 0, n2 - 1
do j = 1, n1h - 1
jx = 2 * j
t(jx, i) = a(j, i)
t(jx + 1, i) = a(n1 - j, i)
end do
end do
t(0, 0) = a(0, 0)
t(1, 0) = a(n1h, 0)
t(0, n2h) = a(0, n2h)
t(1, n2h) = a(n1h, n2h)
do i = 1, n2h - 1
ic = n2 - i
t(0, i) = a(0, i)
t(1, ic) = a(n1h, i)
t(1, i) = a(0, ic)
t(0, ic) = a(n1h, ic)
end do
call dctfsub(n1max, n1, n2, t, nc, w(nw))
if (n2 .gt. 2) then
call bitrv2col(n1max, n1, n2, ip(2), t)
end if
call cftfcol(n1max, n1, n2, t, w)
do i = 0, n2 - 1
t(1, i) = 0.5d0 * (t(0, i) - t(1, i))
t(0, i) = t(0, i) - t(1, i)
end do
if (n1 .gt. 4) then
call rftfrow(n1max, n1, n2, t, nc, w(nw))
call bitrv2row(n1max, n1, n2, ip(2), t)
end if
call cftfrow(n1max, n1, n2, t, w)
do i = 0, n2h - 1
ix = 2 * i
ic = n2 - 1 - i
do j = 0, n1h - 1
jx = 2 * j
jc = n1 - 1 - j
a(jx, ix) = t(j, i)
a(jx + 1, ix) = t(jc, i)
a(jx, ix + 1) = t(j, ic)
a(jx + 1, ix + 1) = t(jc, ic)
end do
end do
else
do i = 0, n2h - 1
ix = 2 * i
ic = n2 - 1 - i
do j = 0, n1h - 1
jx = 2 * j
jc = n1 - 1 - j
t(j, i) = a(jx, ix)
t(jc, i) = a(jx + 1, ix)
t(j, ic) = a(jx, ix + 1)
t(jc, ic) = a(jx + 1, ix + 1)
end do
end do
if (n1 .gt. 4) then
call bitrv2row(n1max, n1, n2, ip(2), t)
end if
call cftbrow(n1max, n1, n2, t, w)
if (n1 .gt. 4) then
call rftbrow(n1max, n1, n2, t, nc, w(nw))
end if
do i = 0, n2 - 1
xi = t(0, i) - t(1, i)
t(0, i) = t(0, i) + t(1, i)
t(1, i) = xi
end do
if (n2 .gt. 2) then
call bitrv2col(n1max, n1, n2, ip(2), t)
end if
call cftbcol(n1max, n1, n2, t, w)
call dctbsub(n1max, n1, n2, t, nc, w(nw))
do i = 0, n2 - 1
do j = 1, n1h - 1
jx = 2 * j
a(j, i) = t(jx, i)
a(n1 - j, i) = t(jx + 1, i)
end do
end do
a(0, 0) = t(0, 0)
a(n1h, 0) = t(1, 0)
a(0, n2h) = t(0, n2h)
a(n1h, n2h) = t(1, n2h)
do i = 1, n2h - 1
ic = n2 - i
a(0, i) = t(0, i)
a(n1h, i) = t(1, ic)
a(0, ic) = t(1, i)
a(n1h, ic) = t(0, ic)
end do
end if
end
!
subroutine ddst2d(n1max, n1, n2, isgn, a, t, ip, w)
integer n1max, n1, n2, isgn, ip(0 : *), n, nw, nc, n1h, n2h,
& i, ix, ic, j, jx, jc
real*8 a(0 : n1max - 1, 0 : n2 - 1),
& t(0 : n1max - 1, 0 : n2 - 1), w(0 : *), xi
n = max(n1, 2 * n2)
nw = ip(0)
if (n .gt. 4 * nw) then
nw = n / 4
call makewt(nw, ip, w)
end if
nc = ip(1)
if (n1 .gt. nc .or. n2 .gt. nc) then
nc = max(n1, n2)
call makect(nc, ip, w(nw))
end if
n1h = n1 / 2
n2h = n2 / 2
if (isgn .ge. 0) then
do i = 0, n2 - 1
do j = 1, n1h - 1
jx = 2 * j
t(jx, i) = a(j, i)
t(jx + 1, i) = a(n1 - j, i)
end do
end do
t(0, 0) = a(0, 0)
t(1, 0) = a(n1h, 0)
t(0, n2h) = a(0, n2h)
t(1, n2h) = a(n1h, n2h)
do i = 1, n2h - 1
ic = n2 - i
t(0, i) = a(0, i)
t(1, ic) = a(n1h, i)
t(1, i) = a(0, ic)
t(0, ic) = a(n1h, ic)
end do
call dstfsub(n1max, n1, n2, t, nc, w(nw))
if (n2 .gt. 2) then
call bitrv2col(n1max, n1, n2, ip(2), t)
end if
call cftfcol(n1max, n1, n2, t, w)
do i = 0, n2 - 1
t(1, i) = 0.5d0 * (t(0, i) - t(1, i))
t(0, i) = t(0, i) - t(1, i)
end do
if (n1 .gt. 4) then
call rftfrow(n1max, n1, n2, t, nc, w(nw))
call bitrv2row(n1max, n1, n2, ip(2), t)
end if
call cftfrow(n1max, n1, n2, t, w)
do i = 0, n2h - 1
ix = 2 * i
ic = n2 - 1 - i
do j = 0, n1h - 1
jx = 2 * j
jc = n1 - 1 - j
a(jx, ix) = t(j, i)
a(jx + 1, ix) = -t(jc, i)
a(jx, ix + 1) = -t(j, ic)
a(jx + 1, ix + 1) = t(jc, ic)
end do
end do
else
do i = 0, n2h - 1
ix = 2 * i
ic = n2 - 1 - i
do j = 0, n1h - 1
jx = 2 * j
jc = n1 - 1 - j
t(j, i) = a(jx, ix)
t(jc, i) = -a(jx + 1, ix)
t(j, ic) = -a(jx, ix + 1)
t(jc, ic) = a(jx + 1, ix + 1)
end do
end do
if (n1 .gt. 4) then
call bitrv2row(n1max, n1, n2, ip(2), t)
end if
call cftbrow(n1max, n1, n2, t, w)
if (n1 .gt. 4) then
call rftbrow(n1max, n1, n2, t, nc, w(nw))
end if
do i = 0, n2 - 1
xi = t(0, i) - t(1, i)
t(0, i) = t(0, i) + t(1, i)
t(1, i) = xi
end do
if (n2 .gt. 2) then
call bitrv2col(n1max, n1, n2, ip(2), t)
end if
call cftbcol(n1max, n1, n2, t, w)
call dstbsub(n1max, n1, n2, t, nc, w(nw))
do i = 0, n2 - 1
do j = 1, n1h - 1
jx = 2 * j
a(j, i) = t(jx, i)
a(n1 - j, i) = t(jx + 1, i)
end do
end do
a(0, 0) = t(0, 0)
a(n1h, 0) = t(1, 0)
a(0, n2h) = t(0, n2h)
a(n1h, n2h) = t(1, n2h)
do i = 1, n2h - 1
ic = n2 - i
a(0, i) = t(0, i)
a(n1h, i) = t(1, ic)
a(0, ic) = t(1, i)
a(n1h, ic) = t(0, ic)
end do
end if
end
!
! -------- initializing routines --------
!
subroutine makewt(nw, ip, w)
integer nw, ip(0 : *), nwh, j
real*8 w(0 : nw - 1), delta, x, y
ip(0) = nw
ip(1) = 1
if (nw .gt. 2) then
nwh = nw / 2
delta = atan(1.0d0) / nwh
w(0) = 1
w(1) = 0
w(nwh) = cos(delta * nwh)
w(nwh + 1) = w(nwh)
do j = 2, nwh - 2, 2
x = cos(delta * j)
y = sin(delta * j)
w(j) = x
w(j + 1) = y
w(nw - j) = y
w(nw - j + 1) = x
end do
call bitrv2(nw, ip(2), w)
end if
end
!
subroutine makect(nc, ip, c)
integer nc, ip(0 : *), nch, j
real*8 c(0 : nc - 1), delta
ip(1) = nc
if (nc .gt. 1) then
nch = nc / 2
delta = atan(1.0d0) / nch
c(0) = 0.5d0
c(nch) = 0.5d0 * cos(delta * nch)
do j = 1, nch - 1
c(j) = 0.5d0 * cos(delta * j)
c(nc - j) = 0.5d0 * sin(delta * j)
end do
end if
end
!
! -------- child routines --------
!
subroutine bitrv2(n, ip, a)
integer n, ip(0 : *), j, j1, k, k1, l, m, m2
real*8 a(0 : n - 1), xr, xi
ip(0) = 0
l = n
m = 1
do while (4 * m .lt. l)
l = l / 2
do j = 0, m - 1
ip(m + j) = ip(j) + l
end do
m = m * 2
end do
if (4 * m .gt. l) then
do k = 1, m - 1
do j = 0, k - 1
j1 = 2 * j + ip(k)
k1 = 2 * k + ip(j)
xr = a(j1)
xi = a(j1 + 1)
a(j1) = a(k1)
a(j1 + 1) = a(k1 + 1)
a(k1) = xr
a(k1 + 1) = xi
end do
end do
else
m2 = 2 * m
do k = 1, m - 1
do j = 0, k - 1
j1 = 2 * j + ip(k)
k1 = 2 * k + ip(j)
xr = a(j1)
xi = a(j1 + 1)
a(j1) = a(k1)
a(j1 + 1) = a(k1 + 1)
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + m2
k1 = k1 + m2
xr = a(j1)
xi = a(j1 + 1)
a(j1) = a(k1)
a(j1 + 1) = a(k1 + 1)
a(k1) = xr
a(k1 + 1) = xi
end do
end do
end if
end
!
subroutine bitrv2row(n1max, n, n2, ip, a)
integer n1max, n, n2, ip(0 : *), i, j, j1, k, k1, l, m, m2
real*8 a(0 : n1max - 1, 0 : n2 - 1), xr, xi
ip(0) = 0
l = n
m = 1
do while (4 * m .lt. l)
l = l / 2
do j = 0, m - 1
ip(m + j) = ip(j) + l
end do
m = m * 2
end do
if (4 * m .gt. l) then
do i = 0, n2 - 1
do k = 1, m - 1
do j = 0, k - 1
j1 = 2 * j + ip(k)
k1 = 2 * k + ip(j)
xr = a(j1, i)
xi = a(j1 + 1, i)
a(j1, i) = a(k1, i)
a(j1 + 1, i) = a(k1 + 1, i)
a(k1, i) = xr
a(k1 + 1, i) = xi
end do
end do
end do
else
m2 = 2 * m
do i = 0, n2 - 1
do k = 1, m - 1
do j = 0, k - 1
j1 = 2 * j + ip(k)
k1 = 2 * k + ip(j)
xr = a(j1, i)
xi = a(j1 + 1, i)
a(j1, i) = a(k1, i)
a(j1 + 1, i) = a(k1 + 1, i)
a(k1, i) = xr
a(k1 + 1, i) = xi
j1 = j1 + m2
k1 = k1 + m2
xr = a(j1, i)
xi = a(j1 + 1, i)
a(j1, i) = a(k1, i)
a(j1 + 1, i) = a(k1 + 1, i)
a(k1, i) = xr
a(k1 + 1, i) = xi
end do
end do
end do
end if
end
!
subroutine bitrv2col(n1max, n1, n, ip, a)
integer n1max, n1, n, ip(0 : *), i, j, j1, k, k1, l, m
real*8 a(0 : n1max - 1, 0 : n - 1), xr, xi
ip(0) = 0
l = n
m = 1
do while (2 * m .lt. l)
l = l / 2
do j = 0, m - 1
ip(m + j) = ip(j) + l
end do
m = m * 2
end do
if (2 * m .gt. l) then
do k = 1, m - 1
do j = 0, k - 1
j1 = j + ip(k)
k1 = k + ip(j)
do i = 0, n1 - 2, 2
xr = a(i, j1)
xi = a(i + 1, j1)
a(i, j1) = a(i, k1)
a(i + 1, j1) = a(i + 1, k1)
a(i, k1) = xr
a(i + 1, k1) = xi
end do
end do
end do
else
do k = 1, m - 1
do j = 0, k - 1
j1 = j + ip(k)
k1 = k + ip(j)
do i = 0, n1 - 2, 2
xr = a(i, j1)
xi = a(i + 1, j1)
a(i, j1) = a(i, k1)
a(i + 1, j1) = a(i + 1, k1)
a(i, k1) = xr
a(i + 1, k1) = xi
end do
j1 = j1 + m
k1 = k1 + m
do i = 0, n1 - 2, 2
xr = a(i, j1)
xi = a(i + 1, j1)
a(i, j1) = a(i, k1)
a(i + 1, j1) = a(i + 1, k1)
a(i, k1) = xr
a(i + 1, k1) = xi
end do
end do
end do
end if
end
!
subroutine cftbrow(n1max, n, n2, a, w)
integer n1max, n, n2, i, j, j1, j2, j3, k, k1, ks, l, m
real*8 a(0 : n1max - 1, 0 : n2 - 1), w(0 : *)
real*8 wk1r, wk1i, wk2r, wk2i, wk3r, wk3i
real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i
do i = 0, n2 - 1
l = 2
do while (2 * l .lt. n)
m = 4 * l
do j = 0, l - 2, 2
j1 = j + l
j2 = j1 + l
j3 = j2 + l
x0r = a(j, i) + a(j1, i)
x0i = a(j + 1, i) + a(j1 + 1, i)
x1r = a(j, i) - a(j1, i)
x1i = a(j + 1, i) - a(j1 + 1, i)
x2r = a(j2, i) + a(j3, i)
x2i = a(j2 + 1, i) + a(j3 + 1, i)
x3r = a(j2, i) - a(j3, i)
x3i = a(j2 + 1, i) - a(j3 + 1, i)
a(j, i) = x0r + x2r
a(j + 1, i) = x0i + x2i
a(j2, i) = x0r - x2r
a(j2 + 1, i) = x0i - x2i
a(j1, i) = x1r - x3i
a(j1 + 1, i) = x1i + x3r
a(j3, i) = x1r + x3i
a(j3 + 1, i) = x1i - x3r
end do
if (m .lt. n) then
wk1r = w(2)
do j = m, l + m - 2, 2
j1 = j + l
j2 = j1 + l
j3 = j2 + l
x0r = a(j, i) + a(j1, i)
x0i = a(j + 1, i) + a(j1 + 1, i)
x1r = a(j, i) - a(j1, i)
x1i = a(j + 1, i) - a(j1 + 1, i)
x2r = a(j2, i) + a(j3, i)
x2i = a(j2 + 1, i) + a(j3 + 1, i)
x3r = a(j2, i) - a(j3, i)
x3i = a(j2 + 1, i) - a(j3 + 1, i)
a(j, i) = x0r + x2r
a(j + 1, i) = x0i + x2i
a(j2, i) = x2i - x0i
a(j2 + 1, i) = x0r - x2r
x0r = x1r - x3i
x0i = x1i + x3r
a(j1, i) = wk1r * (x0r - x0i)
a(j1 + 1, i) = wk1r * (x0r + x0i)
x0r = x3i + x1r
x0i = x3r - x1i
a(j3, i) = wk1r * (x0i - x0r)
a(j3 + 1, i) = wk1r * (x0i + x0r)
end do
k1 = 1
ks = -1
do k = 2 * m, n - m, m
k1 = k1 + 1
ks = -ks
wk1r = w(2 * k1)
wk1i = w(2 * k1 + 1)
wk2r = ks * w(k1)
wk2i = w(k1 + ks)
wk3r = wk1r - 2 * wk2i * wk1i
wk3i = 2 * wk2i * wk1r - wk1i
do j = k, l + k - 2, 2
j1 = j + l
j2 = j1 + l
j3 = j2 + l
x0r = a(j, i) + a(j1, i)
x0i = a(j + 1, i) + a(j1 + 1, i)
x1r = a(j, i) - a(j1, i)
x1i = a(j + 1, i) - a(j1 + 1, i)
x2r = a(j2, i) + a(j3, i)
x2i = a(j2 + 1, i) + a(j3 + 1, i)
x3r = a(j2, i) - a(j3, i)
x3i = a(j2 + 1, i) - a(j3 + 1, i)
a(j, i) = x0r + x2r
a(j + 1, i) = x0i + x2i
x0r = x0r - x2r
x0i = x0i - x2i
a(j2, i) = wk2r * x0r - wk2i * x0i
a(j2 + 1, i) = wk2r * x0i + wk2i * x0r
x0r = x1r - x3i
x0i = x1i + x3r
a(j1, i) = wk1r * x0r - wk1i * x0i
a(j1 + 1, i) = wk1r * x0i + wk1i * x0r
x0r = x1r + x3i
x0i = x1i - x3r
a(j3, i) = wk3r * x0r - wk3i * x0i
a(j3 + 1, i) = wk3r * x0i + wk3i * x0r
end do
end do
end if
l = m
end do
if (l .lt. n) then
do j = 0, l - 2, 2
j1 = j + l
x0r = a(j, i) - a(j1, i)
x0i = a(j + 1, i) - a(j1 + 1, i)
a(j, i) = a(j, i) + a(j1, i)
a(j + 1, i) = a(j + 1, i) + a(j1 + 1, i)
a(j1, i) = x0r
a(j1 + 1, i) = x0i
end do
end if
end do
end
!
subroutine cftbcol(n1max, n1, n, a, w)
integer n1max, n1, n, i, j, j1, j2, j3, k, k1, ks, l, m
real*8 a(0 : n1max - 1, 0 : n - 1), w(0 : *)
real*8 wk1r, wk1i, wk2r, wk2i, wk3r, wk3i
real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i
l = 1
do while (2 * l .lt. n)
m = 4 * l
do j = 0, l - 1
j1 = j + l
j2 = j1 + l
j3 = j2 + l
do i = 0, n1 - 2, 2
x0r = a(i, j) + a(i, j1)
x0i = a(i + 1, j) + a(i + 1, j1)
x1r = a(i, j) - a(i, j1)
x1i = a(i + 1, j) - a(i + 1, j1)
x2r = a(i, j2) + a(i, j3)
x2i = a(i + 1, j2) + a(i + 1, j3)
x3r = a(i, j2) - a(i, j3)
x3i = a(i + 1, j2) - a(i + 1, j3)
a(i, j) = x0r + x2r
a(i + 1, j) = x0i + x2i
a(i, j2) = x0r - x2r
a(i + 1, j2) = x0i - x2i
a(i, j1) = x1r - x3i
a(i + 1, j1) = x1i + x3r
a(i, j3) = x1r + x3i
a(i + 1, j3) = x1i - x3r
end do
end do
if (m .lt. n) then
wk1r = w(2)
do j = m, l + m - 1
j1 = j + l
j2 = j1 + l
j3 = j2 + l
do i = 0, n1 - 2, 2
x0r = a(i, j) + a(i, j1)
x0i = a(i + 1, j) + a(i + 1, j1)
x1r = a(i, j) - a(i, j1)
x1i = a(i + 1, j) - a(i + 1, j1)
x2r = a(i, j2) + a(i, j3)
x2i = a(i + 1, j2) + a(i + 1, j3)
x3r = a(i, j2) - a(i, j3)
x3i = a(i + 1, j2) - a(i + 1, j3)
a(i, j) = x0r + x2r
a(i + 1, j) = x0i + x2i
a(i, j2) = x2i - x0i
a(i + 1, j2) = x0r - x2r
x0r = x1r - x3i
x0i = x1i + x3r
a(i, j1) = wk1r * (x0r - x0i)
a(i + 1, j1) = wk1r * (x0r + x0i)
x0r = x3i + x1r
x0i = x3r - x1i
a(i, j3) = wk1r * (x0i - x0r)
a(i + 1, j3) = wk1r * (x0i + x0r)
end do
end do
k1 = 1
ks = -1
do k = 2 * m, n - m, m
k1 = k1 + 1
ks = -ks
wk1r = w(2 * k1)
wk1i = w(2 * k1 + 1)
wk2r = ks * w(k1)
wk2i = w(k1 + ks)
wk3r = wk1r - 2 * wk2i * wk1i
wk3i = 2 * wk2i * wk1r - wk1i
do j = k, l + k - 1
j1 = j + l
j2 = j1 + l
j3 = j2 + l
do i = 0, n1 - 2, 2
x0r = a(i, j) + a(i, j1)
x0i = a(i + 1, j) + a(i + 1, j1)
x1r = a(i, j) - a(i, j1)
x1i = a(i + 1, j) - a(i + 1, j1)
x2r = a(i, j2) + a(i, j3)
x2i = a(i + 1, j2) + a(i + 1, j3)
x3r = a(i, j2) - a(i, j3)
x3i = a(i + 1, j2) - a(i + 1, j3)
a(i, j) = x0r + x2r
a(i + 1, j) = x0i + x2i
x0r = x0r - x2r
x0i = x0i - x2i
a(i, j2) = wk2r * x0r - wk2i * x0i
a(i + 1, j2) = wk2r * x0i + wk2i * x0r
x0r = x1r - x3i
x0i = x1i + x3r
a(i, j1) = wk1r * x0r - wk1i * x0i
a(i + 1, j1) = wk1r * x0i + wk1i * x0r
x0r = x1r + x3i
x0i = x1i - x3r
a(i, j3) = wk3r * x0r - wk3i * x0i
a(i + 1, j3) = wk3r * x0i + wk3i * x0r
end do
end do
end do
end if
l = m
end do
if (l .lt. n) then
do j = 0, l - 1
j1 = j + l
do i = 0, n1 - 2, 2
x0r = a(i, j) - a(i, j1)
x0i = a(i + 1, j) - a(i + 1, j1)
a(i, j) = a(i, j) + a(i, j1)
a(i + 1, j) = a(i + 1, j) + a(i + 1, j1)
a(i, j1) = x0r
a(i + 1, j1) = x0i
end do
end do
end if
end
!
subroutine cftfrow(n1max, n, n2, a, w)
integer n1max, n, n2, i, j, j1, j2, j3, k, k1, ks, l, m
real*8 a(0 : n1max - 1, 0 : n2 - 1), w(0 : *)
real*8 wk1r, wk1i, wk2r, wk2i, wk3r, wk3i
real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i
do i = 0, n2 - 1
l = 2
do while (2 * l .lt. n)
m = 4 * l
do j = 0, l - 2, 2
j1 = j + l
j2 = j1 + l
j3 = j2 + l
x0r = a(j, i) + a(j1, i)
x0i = a(j + 1, i) + a(j1 + 1, i)
x1r = a(j, i) - a(j1, i)
x1i = a(j + 1, i) - a(j1 + 1, i)
x2r = a(j2, i) + a(j3, i)
x2i = a(j2 + 1, i) + a(j3 + 1, i)
x3r = a(j2, i) - a(j3, i)
x3i = a(j2 + 1, i) - a(j3 + 1, i)
a(j, i) = x0r + x2r
a(j + 1, i) = x0i + x2i
a(j2, i) = x0r - x2r
a(j2 + 1, i) = x0i - x2i
a(j1, i) = x1r + x3i
a(j1 + 1, i) = x1i - x3r
a(j3, i) = x1r - x3i
a(j3 + 1, i) = x1i + x3r
end do
if (m .lt. n) then
wk1r = w(2)
do j = m, l + m - 2, 2
j1 = j + l
j2 = j1 + l
j3 = j2 + l
x0r = a(j, i) + a(j1, i)
x0i = a(j + 1, i) + a(j1 + 1, i)
x1r = a(j, i) - a(j1, i)
x1i = a(j + 1, i) - a(j1 + 1, i)
x2r = a(j2, i) + a(j3, i)
x2i = a(j2 + 1, i) + a(j3 + 1, i)
x3r = a(j2, i) - a(j3, i)
x3i = a(j2 + 1, i) - a(j3 + 1, i)
a(j, i) = x0r + x2r
a(j + 1, i) = x0i + x2i
a(j2, i) = x0i - x2i
a(j2 + 1, i) = x2r - x0r
x0r = x1r + x3i
x0i = x1i - x3r
a(j1, i) = wk1r * (x0i + x0r)
a(j1 + 1, i) = wk1r * (x0i - x0r)
x0r = x3i - x1r
x0i = x3r + x1i
a(j3, i) = wk1r * (x0r + x0i)
a(j3 + 1, i) = wk1r * (x0r - x0i)
end do
k1 = 1
ks = -1
do k = 2 * m, n - m, m
k1 = k1 + 1
ks = -ks
wk1r = w(2 * k1)
wk1i = w(2 * k1 + 1)
wk2r = ks * w(k1)
wk2i = w(k1 + ks)
wk3r = wk1r - 2 * wk2i * wk1i
wk3i = 2 * wk2i * wk1r - wk1i
do j = k, l + k - 2, 2
j1 = j + l
j2 = j1 + l
j3 = j2 + l
x0r = a(j, i) + a(j1, i)
x0i = a(j + 1, i) + a(j1 + 1, i)
x1r = a(j, i) - a(j1, i)
x1i = a(j + 1, i) - a(j1 + 1, i)
x2r = a(j2, i) + a(j3, i)
x2i = a(j2 + 1, i) + a(j3 + 1, i)
x3r = a(j2, i) - a(j3, i)
x3i = a(j2 + 1, i) - a(j3 + 1, i)
a(j, i) = x0r + x2r
a(j + 1, i) = x0i + x2i
x0r = x0r - x2r
x0i = x0i - x2i
a(j2, i) = wk2r * x0r + wk2i * x0i
a(j2 + 1, i) = wk2r * x0i - wk2i * x0r
x0r = x1r + x3i
x0i = x1i - x3r
a(j1, i) = wk1r * x0r + wk1i * x0i
a(j1 + 1, i) = wk1r * x0i - wk1i * x0r
x0r = x1r - x3i
x0i = x1i + x3r
a(j3, i) = wk3r * x0r + wk3i * x0i
a(j3 + 1, i) = wk3r * x0i - wk3i * x0r
end do
end do
end if
l = m
end do
if (l .lt. n) then
do j = 0, l - 2, 2
j1 = j + l
x0r = a(j, i) - a(j1, i)
x0i = a(j + 1, i) - a(j1 + 1, i)
a(j, i) = a(j, i) + a(j1, i)
a(j + 1, i) = a(j + 1, i) + a(j1 + 1, i)
a(j1, i) = x0r
a(j1 + 1, i) = x0i
end do
end if
end do
end
!
subroutine cftfcol(n1max, n1, n, a, w)
integer n1max, n1, n, i, j, j1, j2, j3, k, k1, ks, l, m
real*8 a(0 : n1max - 1, 0 : n - 1), w(0 : *)
real*8 wk1r, wk1i, wk2r, wk2i, wk3r, wk3i
real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i
l = 1
do while (2 * l .lt. n)
m = 4 * l
do j = 0, l - 1
j1 = j + l
j2 = j1 + l
j3 = j2 + l
do i = 0, n1 - 2, 2
x0r = a(i, j) + a(i, j1)
x0i = a(i + 1, j) + a(i + 1, j1)
x1r = a(i, j) - a(i, j1)
x1i = a(i + 1, j) - a(i + 1, j1)
x2r = a(i, j2) + a(i, j3)
x2i = a(i + 1, j2) + a(i + 1, j3)
x3r = a(i, j2) - a(i, j3)
x3i = a(i + 1, j2) - a(i + 1, j3)
a(i, j) = x0r + x2r
a(i + 1, j) = x0i + x2i
a(i, j2) = x0r - x2r
a(i + 1, j2) = x0i - x2i
a(i, j1) = x1r + x3i
a(i + 1, j1) = x1i - x3r
a(i, j3) = x1r - x3i
a(i + 1, j3) = x1i + x3r
end do
end do
if (m .lt. n) then
wk1r = w(2)
do j = m, l + m - 1
j1 = j + l
j2 = j1 + l
j3 = j2 + l
do i = 0, n1 - 2, 2
x0r = a(i, j) + a(i, j1)
x0i = a(i + 1, j) + a(i + 1, j1)
x1r = a(i, j) - a(i, j1)
x1i = a(i + 1, j) - a(i + 1, j1)
x2r = a(i, j2) + a(i, j3)
x2i = a(i + 1, j2) + a(i + 1, j3)
x3r = a(i, j2) - a(i, j3)
x3i = a(i + 1, j2) - a(i + 1, j3)
a(i, j) = x0r + x2r
a(i + 1, j) = x0i + x2i
a(i, j2) = x0i - x2i
a(i + 1, j2) = x2r - x0r
x0r = x1r + x3i
x0i = x1i - x3r
a(i, j1) = wk1r * (x0i + x0r)
a(i + 1, j1) = wk1r * (x0i - x0r)
x0r = x3i - x1r
x0i = x3r + x1i
a(i, j3) = wk1r * (x0r + x0i)
a(i + 1, j3) = wk1r * (x0r - x0i)
end do
end do
k1 = 1
ks = -1
do k = 2 * m, n - m, m
k1 = k1 + 1
ks = -ks
wk1r = w(2 * k1)
wk1i = w(2 * k1 + 1)
wk2r = ks * w(k1)
wk2i = w(k1 + ks)
wk3r = wk1r - 2 * wk2i * wk1i
wk3i = 2 * wk2i * wk1r - wk1i
do j = k, l + k - 1
j1 = j + l
j2 = j1 + l
j3 = j2 + l
do i = 0, n1 - 2, 2
x0r = a(i, j) + a(i, j1)
x0i = a(i + 1, j) + a(i + 1, j1)
x1r = a(i, j) - a(i, j1)
x1i = a(i + 1, j) - a(i + 1, j1)
x2r = a(i, j2) + a(i, j3)
x2i = a(i + 1, j2) + a(i + 1, j3)
x3r = a(i, j2) - a(i, j3)
x3i = a(i + 1, j2) - a(i + 1, j3)
a(i, j) = x0r + x2r
a(i + 1, j) = x0i + x2i
x0r = x0r - x2r
x0i = x0i - x2i
a(i, j2) = wk2r * x0r + wk2i * x0i
a(i + 1, j2) = wk2r * x0i - wk2i * x0r
x0r = x1r + x3i
x0i = x1i - x3r
a(i, j1) = wk1r * x0r + wk1i * x0i
a(i + 1, j1) = wk1r * x0i - wk1i * x0r
x0r = x1r - x3i
x0i = x1i + x3r
a(i, j3) = wk3r * x0r + wk3i * x0i
a(i + 1, j3) = wk3r * x0i - wk3i * x0r
end do
end do
end do
end if
l = m
end do
if (l .lt. n) then
do j = 0, l - 1
j1 = j + l
do i = 0, n1 - 2, 2
x0r = a(i, j) - a(i, j1)
x0i = a(i + 1, j) - a(i + 1, j1)
a(i, j) = a(i, j) + a(i, j1)
a(i + 1, j) = a(i + 1, j) + a(i + 1, j1)
a(i, j1) = x0r
a(i + 1, j1) = x0i
end do
end do
end if
end
!
subroutine rftbrow(n1max, n, n2, a, nc, c)
integer n1max, n, n2, nc, i, j, k, kk, ks
real*8 a(0 : n1max - 1, 0 : n2 - 1), c(0 : nc - 1),
& wkr, wki, xr, xi, yr, yi
ks = 4 * nc / n
do i = 0, n2 - 1
kk = 0
do k = n / 2 - 2, 2, -2
j = n - k
kk = kk + ks
wkr = 0.5d0 - c(kk)
wki = c(nc - kk)
xr = a(k, i) - a(j, i)
xi = a(k + 1, i) + a(j + 1, i)
yr = wkr * xr - wki * xi
yi = wkr * xi + wki * xr
a(k, i) = a(k, i) - yr
a(k + 1, i) = a(k + 1, i) - yi
a(j, i) = a(j, i) + yr
a(j + 1, i) = a(j + 1, i) - yi
end do
end do
end
!
subroutine rftfrow(n1max, n, n2, a, nc, c)
integer n1max, n, n2, nc, i, j, k, kk, ks
real*8 a(0 : n1max - 1, 0 : n2 - 1), c(0 : nc - 1),
& wkr, wki, xr, xi, yr, yi
ks = 4 * nc / n
do i = 0, n2 - 1
kk = 0
do k = n / 2 - 2, 2, -2
j = n - k
kk = kk + ks
wkr = 0.5d0 - c(kk)
wki = c(nc - kk)
xr = a(k, i) - a(j, i)
xi = a(k + 1, i) + a(j + 1, i)
yr = wkr * xr + wki * xi
yi = wkr * xi - wki * xr
a(k, i) = a(k, i) - yr
a(k + 1, i) = a(k + 1, i) - yi
a(j, i) = a(j, i) + yr
a(j + 1, i) = a(j + 1, i) - yi
end do
end do
end
!
subroutine dctbsub(n1max, n1, n2, a, nc, c)
integer n1max, n1, n2, nc, kk1, kk2, ks1, ks2, n2h, j2,
& k1, k2
real*8 a(0 : n1max - 1, 0 : n2 - 1), c(0 : nc - 1),
& w2r, w2i, wkr, wki, wjr, wji, x0r, x0i, x1r, x1i
ks1 = nc / n1
ks2 = nc / n2
n2h = n2 / 2
kk2 = ks2
do k2 = 1, n2h - 1
j2 = n2 - k2
w2r = 2 * c(kk2)
w2i = 2 * c(nc - kk2)
kk2 = kk2 + ks2
kk1 = ks1
do k1 = 2, n1 - 2, 2
x0r = w2r * c(kk1)
x0i = w2i * c(kk1)
x1r = w2r * c(nc - kk1)
x1i = w2i * c(nc - kk1)
wkr = x0r - x1i
wki = x0i + x1r
wji = x0r + x1i
wjr = x0i - x1r
kk1 = kk1 + ks1
x0r = wkr * a(k1, k2) - wki * a(k1 + 1, k2)
x0i = wkr * a(k1 + 1, k2) + wki * a(k1, k2)
x1r = wjr * a(k1, j2) - wji * a(k1 + 1, j2)
x1i = wjr * a(k1 + 1, j2) + wji * a(k1, j2)
a(k1, k2) = x0r + x1i
a(k1 + 1, k2) = x0i - x1r
a(k1, j2) = x1r + x0i
a(k1 + 1, j2) = x1i - x0r
end do
wkr = w2r * 0.5d0
wki = w2i * 0.5d0
wjr = w2r * c(kk1)
wji = w2i * c(kk1)
x0r = a(0, k2) + a(0, j2)
x0i = a(1, k2) - a(1, j2)
x1r = a(0, k2) - a(0, j2)
x1i = a(1, k2) + a(1, j2)
a(0, k2) = wkr * x0r - wki * x0i
a(1, k2) = wkr * x0i + wki * x0r
a(0, j2) = -wjr * x1r + wji * x1i
a(1, j2) = wjr * x1i + wji * x1r
end do
w2r = 2 * c(kk2)
kk1 = ks1
do k1 = 2, n1 - 2, 2
wkr = 2 * c(kk1)
wki = 2 * c(nc - kk1)
wjr = w2r * wkr
wji = w2r * wki
kk1 = kk1 + ks1
x0i = wkr * a(k1 + 1, 0) + wki * a(k1, 0)
a(k1, 0) = wkr * a(k1, 0) - wki * a(k1 + 1, 0)
a(k1 + 1, 0) = x0i
x0i = wjr * a(k1 + 1, n2h) + wji * a(k1, n2h)
a(k1, n2h) = wjr * a(k1, n2h) - wji * a(k1 + 1, n2h)
a(k1 + 1, n2h) = x0i
end do
a(1, 0) = a(1, 0) * w2r
a(0, n2h) = a(0, n2h) * w2r
a(1, n2h) = a(1, n2h) * 0.5d0
end
!
subroutine dctfsub(n1max, n1, n2, a, nc, c)
integer n1max, n1, n2, nc, kk1, kk2, ks1, ks2, n2h, j2,
& k1, k2
real*8 a(0 : n1max - 1, 0 : n2 - 1), c(0 : nc - 1),
& w2r, w2i, wkr, wki, wjr, wji, x0r, x0i, x1r, x1i
ks1 = nc / n1
ks2 = nc / n2
n2h = n2 / 2
kk2 = ks2
do k2 = 1, n2h - 1
j2 = n2 - k2
w2r = 2 * c(kk2)
w2i = 2 * c(nc - kk2)
kk2 = kk2 + ks2
kk1 = ks1
do k1 = 2, n1 - 2, 2
x0r = w2r * c(kk1)
x0i = w2i * c(kk1)
x1r = w2r * c(nc - kk1)
x1i = w2i * c(nc - kk1)
wkr = x0r - x1i
wki = x0i + x1r
wji = x0r + x1i
wjr = x0i - x1r
kk1 = kk1 + ks1
x0r = a(k1, k2) - a(k1 + 1, j2)
x0i = a(k1, j2) + a(k1 + 1, k2)
x1r = a(k1, j2) - a(k1 + 1, k2)
x1i = a(k1, k2) + a(k1 + 1, j2)
a(k1, k2) = wkr * x0r + wki * x0i
a(k1 + 1, k2) = wkr * x0i - wki * x0r
a(k1, j2) = wjr * x1r + wji * x1i
a(k1 + 1, j2) = wjr * x1i - wji * x1r
end do
x0r = 2 * c(kk1)
wjr = x0r * w2r
wji = x0r * w2i
x0r = w2r * a(0, k2) + w2i * a(1, k2)
x0i = w2r * a(1, k2) - w2i * a(0, k2)
x1r = -wjr * a(0, j2) + wji * a(1, j2)
x1i = wjr * a(1, j2) + wji * a(0, j2)
a(0, k2) = x0r + x1r
a(1, k2) = x1i + x0i
a(0, j2) = x0r - x1r
a(1, j2) = x1i - x0i
end do
w2r = 2 * c(kk2)
kk1 = ks1
do k1 = 2, n1 - 2, 2
wkr = 2 * c(kk1)
wki = 2 * c(nc - kk1)
wjr = w2r * wkr
wji = w2r * wki
kk1 = kk1 + ks1
x0i = wkr * a(k1 + 1, 0) - wki * a(k1, 0)
a(k1, 0) = wkr * a(k1, 0) + wki * a(k1 + 1, 0)
a(k1 + 1, 0) = x0i
x0i = wjr * a(k1 + 1, n2h) - wji * a(k1, n2h)
a(k1, n2h) = wjr * a(k1, n2h) + wji * a(k1 + 1, n2h)
a(k1 + 1, n2h) = x0i
end do
w2r = w2r * 2
a(0, 0) = a(0, 0) * 2
a(1, 0) = a(1, 0) * w2r
a(0, n2h) = a(0, n2h) * w2r
end
!
subroutine dstbsub(n1max, n1, n2, a, nc, c)
integer n1max, n1, n2, nc, kk1, kk2, ks1, ks2, n2h, j2,
& k1, k2
real*8 a(0 : n1max - 1, 0 : n2 - 1), c(0 : nc - 1),
& w2r, w2i, wkr, wki, wjr, wji, x0r, x0i, x1r, x1i
ks1 = nc / n1
ks2 = nc / n2
n2h = n2 / 2
kk2 = ks2
do k2 = 1, n2h - 1
j2 = n2 - k2
w2r = 2 * c(kk2)
w2i = 2 * c(nc - kk2)
kk2 = kk2 + ks2
kk1 = ks1
do k1 = 2, n1 - 2, 2
x0r = w2r * c(kk1)
x0i = w2i * c(kk1)
x1r = w2r * c(nc - kk1)
x1i = w2i * c(nc - kk1)
wkr = x0r - x1i
wki = x0i + x1r
wji = x0r + x1i
wjr = x0i - x1r
kk1 = kk1 + ks1
x0r = wkr * a(k1, k2) - wki * a(k1 + 1, k2)
x0i = wkr * a(k1 + 1, k2) + wki * a(k1, k2)
x1r = wjr * a(k1, j2) - wji * a(k1 + 1, j2)
x1i = wjr * a(k1 + 1, j2) + wji * a(k1, j2)
a(k1, k2) = x1i - x0r
a(k1 + 1, k2) = x1r + x0i
a(k1, j2) = x0i - x1r
a(k1 + 1, j2) = x0r + x1i
end do
wkr = w2r * 0.5d0
wki = w2i * 0.5d0
wjr = w2r * c(kk1)
wji = w2i * c(kk1)
x0r = a(0, k2) + a(0, j2)
x0i = a(1, k2) - a(1, j2)
x1r = a(0, k2) - a(0, j2)
x1i = a(1, k2) + a(1, j2)
a(1, k2) = wkr * x0r - wki * x0i
a(0, k2) = wkr * x0i + wki * x0r
a(1, j2) = -wjr * x1r + wji * x1i
a(0, j2) = wjr * x1i + wji * x1r
end do
w2r = 2 * c(kk2)
kk1 = ks1
do k1 = 2, n1 - 2, 2
wkr = 2 * c(kk1)
wki = 2 * c(nc - kk1)
wjr = w2r * wkr
wji = w2r * wki
kk1 = kk1 + ks1
x0i = wkr * a(k1 + 1, 0) + wki * a(k1, 0)
a(k1 + 1, 0) = wkr * a(k1, 0) - wki * a(k1 + 1, 0)
a(k1, 0) = x0i
x0i = wjr * a(k1 + 1, n2h) + wji * a(k1, n2h)
a(k1 + 1, n2h) = wjr * a(k1, n2h) - wji * a(k1 + 1, n2h)
a(k1, n2h) = x0i
end do
a(1, 0) = a(1, 0) * w2r
a(0, n2h) = a(0, n2h) * w2r
a(1, n2h) = a(1, n2h) * 0.5d0
end
!
subroutine dstfsub(n1max, n1, n2, a, nc, c)
integer n1max, n1, n2, nc, kk1, kk2, ks1, ks2, n2h, j2,
& k1, k2
real*8 a(0 : n1max - 1, 0 : n2 - 1), c(0 : nc - 1),
& w2r, w2i, wkr, wki, wjr, wji, x0r, x0i, x1r, x1i
ks1 = nc / n1
ks2 = nc / n2
n2h = n2 / 2
kk2 = ks2
do k2 = 1, n2h - 1
j2 = n2 - k2
w2r = 2 * c(kk2)
w2i = 2 * c(nc - kk2)
kk2 = kk2 + ks2
kk1 = ks1
do k1 = 2, n1 - 2, 2
x0r = w2r * c(kk1)
x0i = w2i * c(kk1)
x1r = w2r * c(nc - kk1)
x1i = w2i * c(nc - kk1)
wkr = x0r - x1i
wki = x0i + x1r
wji = x0r + x1i
wjr = x0i - x1r
kk1 = kk1 + ks1
x0r = a(k1 + 1, j2) - a(k1, k2)
x0i = a(k1 + 1, k2) + a(k1, j2)
x1r = a(k1 + 1, k2) - a(k1, j2)
x1i = a(k1 + 1, j2) + a(k1, k2)
a(k1, k2) = wkr * x0r + wki * x0i
a(k1 + 1, k2) = wkr * x0i - wki * x0r
a(k1, j2) = wjr * x1r + wji * x1i
a(k1 + 1, j2) = wjr * x1i - wji * x1r
end do
x0r = 2 * c(kk1)
wjr = x0r * w2r
wji = x0r * w2i
x0r = w2r * a(1, k2) + w2i * a(0, k2)
x0i = w2r * a(0, k2) - w2i * a(1, k2)
x1r = -wjr * a(1, j2) + wji * a(0, j2)
x1i = wjr * a(0, j2) + wji * a(1, j2)
a(0, k2) = x0r + x1r
a(1, k2) = x1i + x0i
a(0, j2) = x0r - x1r
a(1, j2) = x1i - x0i
end do
w2r = 2 * c(kk2)
kk1 = ks1
do k1 = 2, n1 - 2, 2
wkr = 2 * c(kk1)
wki = 2 * c(nc - kk1)
wjr = w2r * wkr
wji = w2r * wki
kk1 = kk1 + ks1
x0i = wkr * a(k1, 0) - wki * a(k1 + 1, 0)
a(k1, 0) = wkr * a(k1 + 1, 0) + wki * a(k1, 0)
a(k1 + 1, 0) = x0i
x0i = wjr * a(k1, n2h) - wji * a(k1 + 1, n2h)
a(k1, n2h) = wjr * a(k1 + 1, n2h) + wji * a(k1, n2h)
a(k1 + 1, n2h) = x0i
end do
w2r = w2r * 2
a(0, 0) = a(0, 0) * 2
a(1, 0) = a(1, 0) * w2r
a(0, n2h) = a(0, n2h) * w2r
end
!