blob: 6fb26c496119428cdbd010e6bff70f1367682c10 [file] [log] [blame]
! Fast Fourier/Cosine/Sine Transform
! dimension :one
! data length :power of 2
! decimation :frequency
! radix :split-radix
! data :inplace
! table :use
! subroutines
! cdft: Complex Discrete Fourier Transform
! rdft: Real Discrete Fourier Transform
! ddct: Discrete Cosine Transform
! ddst: Discrete Sine Transform
! dfct: Cosine Transform of RDFT (Real Symmetric DFT)
! dfst: Sine Transform of RDFT (Real Anti-symmetric DFT)
!
!
! -------- Complex DFT (Discrete Fourier Transform) --------
! [definition]
! <case1>
! X(k) = sum_j=0^n-1 x(j)*exp(2*pi*i*j*k/n), 0<=k<n
! <case2>
! X(k) = sum_j=0^n-1 x(j)*exp(-2*pi*i*j*k/n), 0<=k<n
! (notes: sum_j=0^n-1 is a summation from j=0 to n-1)
! [usage]
! <case1>
! ip(0) = 0 ! first time only
! call cdft(2*n, 1, a, ip, w)
! <case2>
! ip(0) = 0 ! first time only
! call cdft(2*n, -1, a, ip, w)
! [parameters]
! 2*n :data length (integer)
! n >= 1, n = power of 2
! a(0:2*n-1) :input/output data (real*8)
! input data
! a(2*j) = Re(x(j)),
! a(2*j+1) = Im(x(j)), 0<=j<n
! output data
! a(2*k) = Re(X(k)),
! a(2*k+1) = Im(X(k)), 0<=k<n
! ip(0:*) :work area for bit reversal (integer)
! length of ip >= 2+sqrt(n)
! strictly,
! length of ip >=
! 2+2**(int(log(n+0.5)/log(2.0))/2).
! ip(0),ip(1) are pointers of the cos/sin table.
! w(0:n/2-1) :cos/sin table (real*8)
! w(),ip() are initialized if ip(0) = 0.
! [remark]
! Inverse of
! call cdft(2*n, -1, a, ip, w)
! is
! call cdft(2*n, 1, a, ip, w)
! do j = 0, 2 * n - 1
! a(j) = a(j) / n
! end do
! .
!
!
! -------- Real DFT / Inverse of Real DFT --------
! [definition]
! <case1> RDFT
! R(k) = sum_j=0^n-1 a(j)*cos(2*pi*j*k/n), 0<=k<=n/2
! I(k) = sum_j=0^n-1 a(j)*sin(2*pi*j*k/n), 0<k<n/2
! <case2> IRDFT (excluding scale)
! a(k) = (R(0) + R(n/2)*cos(pi*k))/2 +
! sum_j=1^n/2-1 R(j)*cos(2*pi*j*k/n) +
! sum_j=1^n/2-1 I(j)*sin(2*pi*j*k/n), 0<=k<n
! [usage]
! <case1>
! ip(0) = 0 ! first time only
! call rdft(n, 1, a, ip, w)
! <case2>
! ip(0) = 0 ! first time only
! call rdft(n, -1, a, ip, w)
! [parameters]
! n :data length (integer)
! n >= 2, n = power of 2
! a(0:n-1) :input/output data (real*8)
! <case1>
! output data
! a(2*k) = R(k), 0<=k<n/2
! a(2*k+1) = I(k), 0<k<n/2
! a(1) = R(n/2)
! <case2>
! input data
! a(2*j) = R(j), 0<=j<n/2
! a(2*j+1) = I(j), 0<j<n/2
! a(1) = R(n/2)
! ip(0:*) :work area for bit reversal (integer)
! length of ip >= 2+sqrt(n/2)
! strictly,
! length of ip >=
! 2+2**(int(log(n/2+0.5)/log(2.0))/2).
! ip(0),ip(1) are pointers of the cos/sin table.
! w(0:n/2-1) :cos/sin table (real*8)
! w(),ip() are initialized if ip(0) = 0.
! [remark]
! Inverse of
! call rdft(n, 1, a, ip, w)
! is
! call rdft(n, -1, a, ip, w)
! do j = 0, n - 1
! a(j) = a(j) * 2 / n
! end do
! .
!
!
! -------- DCT (Discrete Cosine Transform) / Inverse of DCT --------
! [definition]
! <case1> IDCT (excluding scale)
! C(k) = sum_j=0^n-1 a(j)*cos(pi*j*(k+1/2)/n), 0<=k<n
! <case2> DCT
! C(k) = sum_j=0^n-1 a(j)*cos(pi*(j+1/2)*k/n), 0<=k<n
! [usage]
! <case1>
! ip(0) = 0 ! first time only
! call ddct(n, 1, a, ip, w)
! <case2>
! ip(0) = 0 ! first time only
! call ddct(n, -1, a, ip, w)
! [parameters]
! n :data length (integer)
! n >= 2, n = power of 2
! a(0:n-1) :input/output data (real*8)
! output data
! a(k) = C(k), 0<=k<n
! ip(0:*) :work area for bit reversal (integer)
! length of ip >= 2+sqrt(n/2)
! strictly,
! length of ip >=
! 2+2**(int(log(n/2+0.5)/log(2.0))/2).
! ip(0),ip(1) are pointers of the cos/sin table.
! w(0:n*5/4-1) :cos/sin table (real*8)
! w(),ip() are initialized if ip(0) = 0.
! [remark]
! Inverse of
! call ddct(n, -1, a, ip, w)
! is
! a(0) = a(0) / 2
! call ddct(n, 1, a, ip, w)
! do j = 0, n - 1
! a(j) = a(j) * 2 / n
! end do
! .
!
!
! -------- DST (Discrete Sine Transform) / Inverse of DST --------
! [definition]
! <case1> IDST (excluding scale)
! S(k) = sum_j=1^n A(j)*sin(pi*j*(k+1/2)/n), 0<=k<n
! <case2> DST
! S(k) = sum_j=0^n-1 a(j)*sin(pi*(j+1/2)*k/n), 0<k<=n
! [usage]
! <case1>
! ip(0) = 0 ! first time only
! call ddst(n, 1, a, ip, w)
! <case2>
! ip(0) = 0 ! first time only
! call ddst(n, -1, a, ip, w)
! [parameters]
! n :data length (integer)
! n >= 2, n = power of 2
! a(0:n-1) :input/output data (real*8)
! <case1>
! input data
! a(j) = A(j), 0<j<n
! a(0) = A(n)
! output data
! a(k) = S(k), 0<=k<n
! <case2>
! output data
! a(k) = S(k), 0<k<n
! a(0) = S(n)
! ip(0:*) :work area for bit reversal (integer)
! length of ip >= 2+sqrt(n/2)
! strictly,
! length of ip >=
! 2+2**(int(log(n/2+0.5)/log(2.0))/2).
! ip(0),ip(1) are pointers of the cos/sin table.
! w(0:n*5/4-1) :cos/sin table (real*8)
! w(),ip() are initialized if ip(0) = 0.
! [remark]
! Inverse of
! call ddst(n, -1, a, ip, w)
! is
! a(0) = a(0) / 2
! call ddst(n, 1, a, ip, w)
! do j = 0, n - 1
! a(j) = a(j) * 2 / n
! end do
! .
!
!
! -------- Cosine Transform of RDFT (Real Symmetric DFT) --------
! [definition]
! C(k) = sum_j=0^n a(j)*cos(pi*j*k/n), 0<=k<=n
! [usage]
! ip(0) = 0 ! first time only
! call dfct(n, a, t, ip, w)
! [parameters]
! n :data length - 1 (integer)
! n >= 2, n = power of 2
! a(0:n) :input/output data (real*8)
! output data
! a(k) = C(k), 0<=k<=n
! t(0:n/2) :work area (real*8)
! ip(0:*) :work area for bit reversal (integer)
! length of ip >= 2+sqrt(n/4)
! strictly,
! length of ip >=
! 2+2**(int(log(n/4+0.5)/log(2.0))/2).
! ip(0),ip(1) are pointers of the cos/sin table.
! w(0:n*5/8-1) :cos/sin table (real*8)
! w(),ip() are initialized if ip(0) = 0.
! [remark]
! Inverse of
! a(0) = a(0) / 2
! a(n) = a(n) / 2
! call dfct(n, a, t, ip, w)
! is
! a(0) = a(0) / 2
! a(n) = a(n) / 2
! call dfct(n, a, t, ip, w)
! do j = 0, n
! a(j) = a(j) * 2 / n
! end do
! .
!
!
! -------- Sine Transform of RDFT (Real Anti-symmetric DFT) --------
! [definition]
! S(k) = sum_j=1^n-1 a(j)*sin(pi*j*k/n), 0<k<n
! [usage]
! ip(0) = 0 ! first time only
! call dfst(n, a, t, ip, w)
! [parameters]
! n :data length + 1 (integer)
! n >= 2, n = power of 2
! a(0:n-1) :input/output data (real*8)
! output data
! a(k) = S(k), 0<k<n
! (a(0) is used for work area)
! t(0:n/2-1) :work area (real*8)
! ip(0:*) :work area for bit reversal (integer)
! length of ip >= 2+sqrt(n/4)
! strictly,
! length of ip >=
! 2+2**(int(log(n/4+0.5)/log(2.0))/2).
! ip(0),ip(1) are pointers of the cos/sin table.
! w(0:n*5/8-1) :cos/sin table (real*8)
! w(),ip() are initialized if ip(0) = 0.
! [remark]
! Inverse of
! call dfst(n, a, t, ip, w)
! is
! call dfst(n, a, t, ip, w)
! do j = 1, n - 1
! a(j) = a(j) * 2 / n
! end do
! .
!
!
! Appendix :
! The cos/sin table is recalculated when the larger table required.
! w() and ip() are compatible with all routines.
!
!
subroutine cdft(n, isgn, a, ip, w)
integer n, isgn, ip(0 : *), nw
real*8 a(0 : n - 1), w(0 : *)
nw = ip(0)
if (n .gt. 4 * nw) then
nw = n / 4
call makewt(nw, ip, w)
end if
if (isgn .ge. 0) then
call cftfsub(n, a, ip, nw, w)
else
call cftbsub(n, a, ip, nw, w)
end if
end
!
subroutine rdft(n, isgn, a, ip, w)
integer n, isgn, ip(0 : *), nw, nc
real*8 a(0 : n - 1), w(0 : *), xi
nw = ip(0)
if (n .gt. 4 * nw) then
nw = n / 4
call makewt(nw, ip, w)
end if
nc = ip(1)
if (n .gt. 4 * nc) then
nc = n / 4
call makect(nc, ip, w(nw))
end if
if (isgn .ge. 0) then
if (n .gt. 4) then
call cftfsub(n, a, ip, nw, w)
call rftfsub(n, a, nc, w(nw))
else if (n .eq. 4) then
call cftfsub(n, a, ip, nw, w)
end if
xi = a(0) - a(1)
a(0) = a(0) + a(1)
a(1) = xi
else
a(1) = 0.5d0 * (a(0) - a(1))
a(0) = a(0) - a(1)
if (n .gt. 4) then
call rftbsub(n, a, nc, w(nw))
call cftbsub(n, a, ip, nw, w)
else if (n .eq. 4) then
call cftbsub(n, a, ip, nw, w)
end if
end if
end
!
subroutine ddct(n, isgn, a, ip, w)
integer n, isgn, ip(0 : *), j, nw, nc
real*8 a(0 : n - 1), w(0 : *), xr
nw = ip(0)
if (n .gt. 4 * nw) then
nw = n / 4
call makewt(nw, ip, w)
end if
nc = ip(1)
if (n .gt. nc) then
nc = n
call makect(nc, ip, w(nw))
end if
if (isgn .lt. 0) then
xr = a(n - 1)
do j = n - 2, 2, -2
a(j + 1) = a(j) - a(j - 1)
a(j) = a(j) + a(j - 1)
end do
a(1) = a(0) - xr
a(0) = a(0) + xr
if (n .gt. 4) then
call rftbsub(n, a, nc, w(nw))
call cftbsub(n, a, ip, nw, w)
else if (n .eq. 4) then
call cftbsub(n, a, ip, nw, w)
end if
end if
call dctsub(n, a, nc, w(nw))
if (isgn .ge. 0) then
if (n .gt. 4) then
call cftfsub(n, a, ip, nw, w)
call rftfsub(n, a, nc, w(nw))
else if (n .eq. 4) then
call cftfsub(n, a, ip, nw, w)
end if
xr = a(0) - a(1)
a(0) = a(0) + a(1)
do j = 2, n - 2, 2
a(j - 1) = a(j) - a(j + 1)
a(j) = a(j) + a(j + 1)
end do
a(n - 1) = xr
end if
end
!
subroutine ddst(n, isgn, a, ip, w)
integer n, isgn, ip(0 : *), j, nw, nc
real*8 a(0 : n - 1), w(0 : *), xr
nw = ip(0)
if (n .gt. 4 * nw) then
nw = n / 4
call makewt(nw, ip, w)
end if
nc = ip(1)
if (n .gt. nc) then
nc = n
call makect(nc, ip, w(nw))
end if
if (isgn .lt. 0) then
xr = a(n - 1)
do j = n - 2, 2, -2
a(j + 1) = -a(j) - a(j - 1)
a(j) = a(j) - a(j - 1)
end do
a(1) = a(0) + xr
a(0) = a(0) - xr
if (n .gt. 4) then
call rftbsub(n, a, nc, w(nw))
call cftbsub(n, a, ip, nw, w)
else if (n .eq. 4) then
call cftbsub(n, a, ip, nw, w)
end if
end if
call dstsub(n, a, nc, w(nw))
if (isgn .ge. 0) then
if (n .gt. 4) then
call cftfsub(n, a, ip, nw, w)
call rftfsub(n, a, nc, w(nw))
else if (n .eq. 4) then
call cftfsub(n, a, ip, nw, w)
end if
xr = a(0) - a(1)
a(0) = a(0) + a(1)
do j = 2, n - 2, 2
a(j - 1) = -a(j) - a(j + 1)
a(j) = a(j) - a(j + 1)
end do
a(n - 1) = -xr
end if
end
!
subroutine dfct(n, a, t, ip, w)
integer n, ip(0 : *), j, k, l, m, mh, nw, nc
real*8 a(0 : n), t(0 : n / 2), w(0 : *), xr, xi, yr, yi
nw = ip(0)
if (n .gt. 8 * nw) then
nw = n / 8
call makewt(nw, ip, w)
end if
nc = ip(1)
if (n .gt. 2 * nc) then
nc = n / 2
call makect(nc, ip, w(nw))
end if
m = n / 2
yi = a(m)
xi = a(0) + a(n)
a(0) = a(0) - a(n)
t(0) = xi - yi
t(m) = xi + yi
if (n .gt. 2) then
mh = m / 2
do j = 1, mh - 1
k = m - j
xr = a(j) - a(n - j)
xi = a(j) + a(n - j)
yr = a(k) - a(n - k)
yi = a(k) + a(n - k)
a(j) = xr
a(k) = yr
t(j) = xi - yi
t(k) = xi + yi
end do
t(mh) = a(mh) + a(n - mh)
a(mh) = a(mh) - a(n - mh)
call dctsub(m, a, nc, w(nw))
if (m .gt. 4) then
call cftfsub(m, a, ip, nw, w)
call rftfsub(m, a, nc, w(nw))
else if (m .eq. 4) then
call cftfsub(m, a, ip, nw, w)
end if
a(n - 1) = a(0) - a(1)
a(1) = a(0) + a(1)
do j = m - 2, 2, -2
a(2 * j + 1) = a(j) + a(j + 1)
a(2 * j - 1) = a(j) - a(j + 1)
end do
l = 2
m = mh
do while (m .ge. 2)
call dctsub(m, t, nc, w(nw))
if (m .gt. 4) then
call cftfsub(m, t, ip, nw, w)
call rftfsub(m, t, nc, w(nw))
else if (m .eq. 4) then
call cftfsub(m, t, ip, nw, w)
end if
a(n - l) = t(0) - t(1)
a(l) = t(0) + t(1)
k = 0
do j = 2, m - 2, 2
k = k + 4 * l
a(k - l) = t(j) - t(j + 1)
a(k + l) = t(j) + t(j + 1)
end do
l = 2 * l
mh = m / 2
do j = 0, mh - 1
k = m - j
t(j) = t(m + k) - t(m + j)
t(k) = t(m + k) + t(m + j)
end do
t(mh) = t(m + mh)
m = mh
end do
a(l) = t(0)
a(n) = t(2) - t(1)
a(0) = t(2) + t(1)
else
a(1) = a(0)
a(2) = t(0)
a(0) = t(1)
end if
end
!
subroutine dfst(n, a, t, ip, w)
integer n, ip(0 : *), j, k, l, m, mh, nw, nc
real*8 a(0 : n - 1), t(0 : n / 2 - 1), w(0 : *), xr, xi, yr, yi
nw = ip(0)
if (n .gt. 8 * nw) then
nw = n / 8
call makewt(nw, ip, w)
end if
nc = ip(1)
if (n .gt. 2 * nc) then
nc = n / 2
call makect(nc, ip, w(nw))
end if
if (n .gt. 2) then
m = n / 2
mh = m / 2
do j = 1, mh - 1
k = m - j
xr = a(j) + a(n - j)
xi = a(j) - a(n - j)
yr = a(k) + a(n - k)
yi = a(k) - a(n - k)
a(j) = xr
a(k) = yr
t(j) = xi + yi
t(k) = xi - yi
end do
t(0) = a(mh) - a(n - mh)
a(mh) = a(mh) + a(n - mh)
a(0) = a(m)
call dstsub(m, a, nc, w(nw))
if (m .gt. 4) then
call cftfsub(m, a, ip, nw, w)
call rftfsub(m, a, nc, w(nw))
else if (m .eq. 4) then
call cftfsub(m, a, ip, nw, w)
end if
a(n - 1) = a(1) - a(0)
a(1) = a(0) + a(1)
do j = m - 2, 2, -2
a(2 * j + 1) = a(j) - a(j + 1)
a(2 * j - 1) = -a(j) - a(j + 1)
end do
l = 2
m = mh
do while (m .ge. 2)
call dstsub(m, t, nc, w(nw))
if (m .gt. 4) then
call cftfsub(m, t, ip, nw, w)
call rftfsub(m, t, nc, w(nw))
else if (m .eq. 4) then
call cftfsub(m, t, ip, nw, w)
end if
a(n - l) = t(1) - t(0)
a(l) = t(0) + t(1)
k = 0
do j = 2, m - 2, 2
k = k + 4 * l
a(k - l) = -t(j) - t(j + 1)
a(k + l) = t(j) - t(j + 1)
end do
l = 2 * l
mh = m / 2
do j = 1, mh - 1
k = m - j
t(j) = t(m + k) + t(m + j)
t(k) = t(m + k) - t(m + j)
end do
t(0) = t(m + mh)
m = mh
end do
a(l) = t(0)
end if
a(0) = 0
end
!
! -------- initializing routines --------
!
subroutine makewt(nw, ip, w)
integer nw, ip(0 : *), j, nwh, nw0, nw1
real*8 w(0 : nw - 1), delta, wn4r, wk1r, wk1i, wk3r, wk3i
ip(0) = nw
ip(1) = 1
if (nw .gt. 2) then
nwh = nw / 2
delta = atan(1.0d0) / nwh
wn4r = cos(delta * nwh)
w(0) = 1
w(1) = wn4r
if (nwh .eq. 4) then
w(2) = cos(delta * 2)
w(3) = sin(delta * 2)
else if (nwh .gt. 4) then
call makeipt(nw, ip)
w(2) = 0.5d0 / cos(delta * 2)
w(3) = 0.5d0 / cos(delta * 6)
do j = 4, nwh - 4, 4
w(j) = cos(delta * j)
w(j + 1) = sin(delta * j)
w(j + 2) = cos(3 * delta * j)
w(j + 3) = -sin(3 * delta * j)
end do
end if
nw0 = 0
do while (nwh .gt. 2)
nw1 = nw0 + nwh
nwh = nwh / 2
w(nw1) = 1
w(nw1 + 1) = wn4r
if (nwh .eq. 4) then
wk1r = w(nw0 + 4)
wk1i = w(nw0 + 5)
w(nw1 + 2) = wk1r
w(nw1 + 3) = wk1i
else if (nwh .gt. 4) then
wk1r = w(nw0 + 4)
wk3r = w(nw0 + 6)
w(nw1 + 2) = 0.5d0 / wk1r
w(nw1 + 3) = 0.5d0 / wk3r
do j = 4, nwh - 4, 4
wk1r = w(nw0 + 2 * j)
wk1i = w(nw0 + 2 * j + 1)
wk3r = w(nw0 + 2 * j + 2)
wk3i = w(nw0 + 2 * j + 3)
w(nw1 + j) = wk1r
w(nw1 + j + 1) = wk1i
w(nw1 + j + 2) = wk3r
w(nw1 + j + 3) = wk3i
end do
end if
nw0 = nw1
end do
end if
end
!
subroutine makeipt(nw, ip)
integer nw, ip(0 : *), j, l, m, m2, p, q
ip(2) = 0
ip(3) = 16
m = 2
l = nw
do while (l .gt. 32)
m2 = 2 * m
q = 8 * m2
do j = m, m2 - 1
p = 4 * ip(j)
ip(m + j) = p
ip(m2 + j) = p + q
end do
m = m2
l = l / 4
end do
end
!
subroutine makect(nc, ip, c)
integer nc, ip(0 : *), j, nch
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) = cos(delta * nch)
c(nch) = 0.5d0 * c(0)
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 cftfsub(n, a, ip, nw, w)
integer n, ip(0 : *), nw
real*8 a(0 : n - 1), w(0 : nw - 1)
if (n .gt. 8) then
if (n .gt. 32) then
call cftf1st(n, a, w(nw - n / 4))
if (n .gt. 512) then
call cftrec4(n, a, nw, w)
else if (n .gt. 128) then
call cftleaf(n, 1, a, nw, w)
else
call cftfx41(n, a, nw, w)
end if
call bitrv2(n, ip, a)
else if (n .eq. 32) then
call cftf161(a, w(nw - 8))
call bitrv216(a)
else
call cftf081(a, w)
call bitrv208(a)
end if
else if (n .eq. 8) then
call cftf040(a)
else if (n .eq. 4) then
call cftx020(a)
end if
end
!
subroutine cftbsub(n, a, ip, nw, w)
integer n, ip(0 : *), nw
real*8 a(0 : n - 1), w(0 : nw - 1)
if (n .gt. 8) then
if (n .gt. 32) then
call cftb1st(n, a, w(nw - n / 4))
if (n .gt. 512) then
call cftrec4(n, a, nw, w)
else if (n .gt. 128) then
call cftleaf(n, 1, a, nw, w)
else
call cftfx41(n, a, nw, w)
end if
call bitrv2conj(n, ip, a)
else if (n .eq. 32) then
call cftf161(a, w(nw - 8))
call bitrv216neg(a)
else
call cftf081(a, w)
call bitrv208neg(a)
end if
else if (n .eq. 8) then
call cftb040(a)
else if (n .eq. 4) then
call cftx020(a)
end if
end
!
subroutine bitrv2(n, ip, a)
integer n, ip(0 : *), j, j1, k, k1, l, m, nh, nm
real*8 a(0 : n - 1), xr, xi, yr, yi
m = 1
l = n / 4
do while (l .gt. 8)
m = m * 2
l = l / 4
end do
nh = n / 2
nm = 4 * m
if (l .eq. 8) then
do k = 0, m - 1
do j = 0, k - 1
j1 = 4 * j + 2 * ip(m + k)
k1 = 4 * k + 2 * ip(m + j)
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 + 2 * nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 - nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 + 2 * nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nh
k1 = k1 + 2
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nm
k1 = k1 - 2 * nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nm
k1 = k1 + nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nm
k1 = k1 - 2 * nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + 2
k1 = k1 + nh
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 + 2 * nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 - nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 + 2 * nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nh
k1 = k1 - 2
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nm
k1 = k1 - 2 * nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nm
k1 = k1 + nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nm
k1 = k1 - 2 * nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
end do
k1 = 4 * k + 2 * ip(m + k)
j1 = k1 + 2
k1 = k1 + nh
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 + 2 * nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 - nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - 2
k1 = k1 - nh
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nh + 2
k1 = k1 + nh + 2
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nh + nm
k1 = k1 + 2 * nm - 2
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
end do
else
do k = 0, m - 1
do j = 0, k - 1
j1 = 4 * j + ip(m + k)
k1 = 4 * k + ip(m + j)
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 + nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nh
k1 = k1 + 2
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nm
k1 = k1 - nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + 2
k1 = k1 + nh
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 + nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nh
k1 = k1 - 2
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nm
k1 = k1 - nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
end do
k1 = 4 * k + ip(m + k)
j1 = k1 + 2
k1 = k1 + nh
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 + nm
xr = a(j1)
xi = a(j1 + 1)
yr = a(k1)
yi = a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
end do
end if
end
!
subroutine bitrv2conj(n, ip, a)
integer n, ip(0 : *), j, j1, k, k1, l, m, nh, nm
real*8 a(0 : n - 1), xr, xi, yr, yi
m = 1
l = n / 4
do while (l .gt. 8)
m = m * 2
l = l / 4
end do
nh = n / 2
nm = 4 * m
if (l .eq. 8) then
do k = 0, m - 1
do j = 0, k - 1
j1 = 4 * j + 2 * ip(m + k)
k1 = 4 * k + 2 * ip(m + j)
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 + 2 * nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 - nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 + 2 * nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nh
k1 = k1 + 2
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nm
k1 = k1 - 2 * nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nm
k1 = k1 + nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nm
k1 = k1 - 2 * nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + 2
k1 = k1 + nh
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 + 2 * nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 - nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 + 2 * nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nh
k1 = k1 - 2
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nm
k1 = k1 - 2 * nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nm
k1 = k1 + nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nm
k1 = k1 - 2 * nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
end do
k1 = 4 * k + 2 * ip(m + k)
j1 = k1 + 2
k1 = k1 + nh
a(j1 - 1) = -a(j1 - 1)
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
a(k1 + 3) = -a(k1 + 3)
j1 = j1 + nm
k1 = k1 + 2 * nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 - nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - 2
k1 = k1 - nh
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nh + 2
k1 = k1 + nh + 2
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nh + nm
k1 = k1 + 2 * nm - 2
a(j1 - 1) = -a(j1 - 1)
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
a(k1 + 3) = -a(k1 + 3)
end do
else
do k = 0, m - 1
do j = 0, k - 1
j1 = 4 * j + ip(m + k)
k1 = 4 * k + ip(m + j)
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 + nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nh
k1 = k1 + 2
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nm
k1 = k1 - nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + 2
k1 = k1 + nh
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 + nm
k1 = k1 + nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nh
k1 = k1 - 2
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
j1 = j1 - nm
k1 = k1 - nm
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
end do
k1 = 4 * k + ip(m + k)
j1 = k1 + 2
k1 = k1 + nh
a(j1 - 1) = -a(j1 - 1)
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
a(k1 + 3) = -a(k1 + 3)
j1 = j1 + nm
k1 = k1 + nm
a(j1 - 1) = -a(j1 - 1)
xr = a(j1)
xi = -a(j1 + 1)
yr = a(k1)
yi = -a(k1 + 1)
a(j1) = yr
a(j1 + 1) = yi
a(k1) = xr
a(k1 + 1) = xi
a(k1 + 3) = -a(k1 + 3)
end do
end if
end
!
subroutine bitrv216(a)
real*8 a(0 : 31), x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i
real*8 x5r, x5i, x7r, x7i, x8r, x8i, x10r, x10i
real*8 x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i
x1r = a(2)
x1i = a(3)
x2r = a(4)
x2i = a(5)
x3r = a(6)
x3i = a(7)
x4r = a(8)
x4i = a(9)
x5r = a(10)
x5i = a(11)
x7r = a(14)
x7i = a(15)
x8r = a(16)
x8i = a(17)
x10r = a(20)
x10i = a(21)
x11r = a(22)
x11i = a(23)
x12r = a(24)
x12i = a(25)
x13r = a(26)
x13i = a(27)
x14r = a(28)
x14i = a(29)
a(2) = x8r
a(3) = x8i
a(4) = x4r
a(5) = x4i
a(6) = x12r
a(7) = x12i
a(8) = x2r
a(9) = x2i
a(10) = x10r
a(11) = x10i
a(14) = x14r
a(15) = x14i
a(16) = x1r
a(17) = x1i
a(20) = x5r
a(21) = x5i
a(22) = x13r
a(23) = x13i
a(24) = x3r
a(25) = x3i
a(26) = x11r
a(27) = x11i
a(28) = x7r
a(29) = x7i
end
!
subroutine bitrv216neg(a)
real*8 a(0 : 31), x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i
real*8 x5r, x5i, x6r, x6i, x7r, x7i, x8r, x8i
real*8 x9r, x9i, x10r, x10i, x11r, x11i, x12r, x12i
real*8 x13r, x13i, x14r, x14i, x15r, x15i
x1r = a(2)
x1i = a(3)
x2r = a(4)
x2i = a(5)
x3r = a(6)
x3i = a(7)
x4r = a(8)
x4i = a(9)
x5r = a(10)
x5i = a(11)
x6r = a(12)
x6i = a(13)
x7r = a(14)
x7i = a(15)
x8r = a(16)
x8i = a(17)
x9r = a(18)
x9i = a(19)
x10r = a(20)
x10i = a(21)
x11r = a(22)
x11i = a(23)
x12r = a(24)
x12i = a(25)
x13r = a(26)
x13i = a(27)
x14r = a(28)
x14i = a(29)
x15r = a(30)
x15i = a(31)
a(2) = x15r
a(3) = x15i
a(4) = x7r
a(5) = x7i
a(6) = x11r
a(7) = x11i
a(8) = x3r
a(9) = x3i
a(10) = x13r
a(11) = x13i
a(12) = x5r
a(13) = x5i
a(14) = x9r
a(15) = x9i
a(16) = x1r
a(17) = x1i
a(18) = x14r
a(19) = x14i
a(20) = x6r
a(21) = x6i
a(22) = x10r
a(23) = x10i
a(24) = x2r
a(25) = x2i
a(26) = x12r
a(27) = x12i
a(28) = x4r
a(29) = x4i
a(30) = x8r
a(31) = x8i
end
!
subroutine bitrv208(a)
real*8 a(0 : 15), x1r, x1i, x3r, x3i, x4r, x4i, x6r, x6i
x1r = a(2)
x1i = a(3)
x3r = a(6)
x3i = a(7)
x4r = a(8)
x4i = a(9)
x6r = a(12)
x6i = a(13)
a(2) = x4r
a(3) = x4i
a(6) = x6r
a(7) = x6i
a(8) = x1r
a(9) = x1i
a(12) = x3r
a(13) = x3i
end
!
subroutine bitrv208neg(a)
real*8 a(0 : 15), x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i
real*8 x5r, x5i, x6r, x6i, x7r, x7i
x1r = a(2)
x1i = a(3)
x2r = a(4)
x2i = a(5)
x3r = a(6)
x3i = a(7)
x4r = a(8)
x4i = a(9)
x5r = a(10)
x5i = a(11)
x6r = a(12)
x6i = a(13)
x7r = a(14)
x7i = a(15)
a(2) = x7r
a(3) = x7i
a(4) = x3r
a(5) = x3i
a(6) = x5r
a(7) = x5i
a(8) = x1r
a(9) = x1i
a(10) = x6r
a(11) = x6i
a(12) = x2r
a(13) = x2i
a(14) = x4r
a(15) = x4i
end
!
subroutine cftf1st(n, a, w)
integer n, j, j0, j1, j2, j3, k, m, mh
real*8 a(0 : n - 1), w(0 : *)
real*8 wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i
real*8 wd1r, wd1i, wd3r, wd3i
real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i
real*8 y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i
mh = n / 8
m = 2 * mh
j1 = m
j2 = j1 + m
j3 = j2 + m
x0r = a(0) + a(j2)
x0i = a(1) + a(j2 + 1)
x1r = a(0) - a(j2)
x1i = a(1) - a(j2 + 1)
x2r = a(j1) + a(j3)
x2i = a(j1 + 1) + a(j3 + 1)
x3r = a(j1) - a(j3)
x3i = a(j1 + 1) - a(j3 + 1)
a(0) = x0r + x2r
a(1) = x0i + x2i
a(j1) = x0r - x2r
a(j1 + 1) = x0i - x2i
a(j2) = x1r - x3i
a(j2 + 1) = x1i + x3r
a(j3) = x1r + x3i
a(j3 + 1) = x1i - x3r
wn4r = w(1)
csc1 = w(2)
csc3 = w(3)
wd1r = 1
wd1i = 0
wd3r = 1
wd3i = 0
k = 0
do j = 2, mh - 6, 4
k = k + 4
wk1r = csc1 * (wd1r + w(k))
wk1i = csc1 * (wd1i + w(k + 1))
wk3r = csc3 * (wd3r + w(k + 2))
wk3i = csc3 * (wd3i + w(k + 3))
wd1r = w(k)
wd1i = w(k + 1)
wd3r = w(k + 2)
wd3i = w(k + 3)
j1 = j + m
j2 = j1 + m
j3 = j2 + m
x0r = a(j) + a(j2)
x0i = a(j + 1) + a(j2 + 1)
x1r = a(j) - a(j2)
x1i = a(j + 1) - a(j2 + 1)
y0r = a(j + 2) + a(j2 + 2)
y0i = a(j + 3) + a(j2 + 3)
y1r = a(j + 2) - a(j2 + 2)
y1i = a(j + 3) - a(j2 + 3)
x2r = a(j1) + a(j3)
x2i = a(j1 + 1) + a(j3 + 1)
x3r = a(j1) - a(j3)
x3i = a(j1 + 1) - a(j3 + 1)
y2r = a(j1 + 2) + a(j3 + 2)
y2i = a(j1 + 3) + a(j3 + 3)
y3r = a(j1 + 2) - a(j3 + 2)
y3i = a(j1 + 3) - a(j3 + 3)
a(j) = x0r + x2r
a(j + 1) = x0i + x2i
a(j + 2) = y0r + y2r
a(j + 3) = y0i + y2i
a(j1) = x0r - x2r
a(j1 + 1) = x0i - x2i
a(j1 + 2) = y0r - y2r
a(j1 + 3) = y0i - y2i
x0r = x1r - x3i
x0i = x1i + x3r
a(j2) = wk1r * x0r - wk1i * x0i
a(j2 + 1) = wk1r * x0i + wk1i * x0r
x0r = y1r - y3i
x0i = y1i + y3r
a(j2 + 2) = wd1r * x0r - wd1i * x0i
a(j2 + 3) = wd1r * x0i + wd1i * x0r
x0r = x1r + x3i
x0i = x1i - x3r
a(j3) = wk3r * x0r + wk3i * x0i
a(j3 + 1) = wk3r * x0i - wk3i * x0r
x0r = y1r + y3i
x0i = y1i - y3r
a(j3 + 2) = wd3r * x0r + wd3i * x0i
a(j3 + 3) = wd3r * x0i - wd3i * x0r
j0 = m - j
j1 = j0 + m
j2 = j1 + m
j3 = j2 + m
x0r = a(j0) + a(j2)
x0i = a(j0 + 1) + a(j2 + 1)
x1r = a(j0) - a(j2)
x1i = a(j0 + 1) - a(j2 + 1)
y0r = a(j0 - 2) + a(j2 - 2)
y0i = a(j0 - 1) + a(j2 - 1)
y1r = a(j0 - 2) - a(j2 - 2)
y1i = a(j0 - 1) - a(j2 - 1)
x2r = a(j1) + a(j3)
x2i = a(j1 + 1) + a(j3 + 1)
x3r = a(j1) - a(j3)
x3i = a(j1 + 1) - a(j3 + 1)
y2r = a(j1 - 2) + a(j3 - 2)
y2i = a(j1 - 1) + a(j3 - 1)
y3r = a(j1 - 2) - a(j3 - 2)
y3i = a(j1 - 1) - a(j3 - 1)
a(j0) = x0r + x2r
a(j0 + 1) = x0i + x2i
a(j0 - 2) = y0r + y2r
a(j0 - 1) = y0i + y2i
a(j1) = x0r - x2r
a(j1 + 1) = x0i - x2i
a(j1 - 2) = y0r - y2r
a(j1 - 1) = y0i - y2i
x0r = x1r - x3i
x0i = x1i + x3r
a(j2) = wk1i * x0r - wk1r * x0i
a(j2 + 1) = wk1i * x0i + wk1r * x0r
x0r = y1r - y3i
x0i = y1i + y3r
a(j2 - 2) = wd1i * x0r - wd1r * x0i
a(j2 - 1) = wd1i * x0i + wd1r * x0r
x0r = x1r + x3i
x0i = x1i - x3r
a(j3) = wk3i * x0r + wk3r * x0i
a(j3 + 1) = wk3i * x0i - wk3r * x0r
x0r = y1r + y3i
x0i = y1i - y3r
a(j3 - 2) = wd3i * x0r + wd3r * x0i
a(j3 - 1) = wd3i * x0i - wd3r * x0r
end do
wk1r = csc1 * (wd1r + wn4r)
wk1i = csc1 * (wd1i + wn4r)
wk3r = csc3 * (wd3r - wn4r)
wk3i = csc3 * (wd3i - wn4r)
j0 = mh
j1 = j0 + m
j2 = j1 + m
j3 = j2 + m
x0r = a(j0 - 2) + a(j2 - 2)
x0i = a(j0 - 1) + a(j2 - 1)
x1r = a(j0 - 2) - a(j2 - 2)
x1i = a(j0 - 1) - a(j2 - 1)
x2r = a(j1 - 2) + a(j3 - 2)
x2i = a(j1 - 1) + a(j3 - 1)
x3r = a(j1 - 2) - a(j3 - 2)
x3i = a(j1 - 1) - a(j3 - 1)
a(j0 - 2) = x0r + x2r
a(j0 - 1) = x0i + x2i
a(j1 - 2) = x0r - x2r
a(j1 - 1) = x0i - x2i
x0r = x1r - x3i
x0i = x1i + x3r
a(j2 - 2) = wk1r * x0r - wk1i * x0i
a(j2 - 1) = wk1r * x0i + wk1i * x0r
x0r = x1r + x3i
x0i = x1i - x3r
a(j3 - 2) = wk3r * x0r + wk3i * x0i
a(j3 - 1) = wk3r * x0i - wk3i * x0r
x0r = a(j0) + a(j2)
x0i = a(j0 + 1) + a(j2 + 1)
x1r = a(j0) - a(j2)
x1i = a(j0 + 1) - a(j2 + 1)
x2r = a(j1) + a(j3)
x2i = a(j1 + 1) + a(j3 + 1)
x3r = a(j1) - a(j3)
x3i = a(j1 + 1) - a(j3 + 1)
a(j0) = x0r + x2r
a(j0 + 1) = x0i + x2i
a(j1) = x0r - x2r
a(j1 + 1) = x0i - x2i
x0r = x1r - x3i
x0i = x1i + x3r
a(j2) = wn4r * (x0r - x0i)
a(j2 + 1) = wn4r * (x0i + x0r)
x0r = x1r + x3i
x0i = x1i - x3r
a(j3) = -wn4r * (x0r + x0i)
a(j3 + 1) = -wn4r * (x0i - x0r)
x0r = a(j0 + 2) + a(j2 + 2)
x0i = a(j0 + 3) + a(j2 + 3)
x1r = a(j0 + 2) - a(j2 + 2)
x1i = a(j0 + 3) - a(j2 + 3)
x2r = a(j1 + 2) + a(j3 + 2)
x2i = a(j1 + 3) + a(j3 + 3)
x3r = a(j1 + 2) - a(j3 + 2)
x3i = a(j1 + 3) - a(j3 + 3)
a(j0 + 2) = x0r + x2r
a(j0 + 3) = x0i + x2i
a(j1 + 2) = x0r - x2r
a(j1 + 3) = x0i - x2i
x0r = x1r - x3i
x0i = x1i + x3r
a(j2 + 2) = wk1i * x0r - wk1r * x0i
a(j2 + 3) = wk1i * x0i + wk1r * x0r
x0r = x1r + x3i
x0i = x1i - x3r
a(j3 + 2) = wk3i * x0r + wk3r * x0i
a(j3 + 3) = wk3i * x0i - wk3r * x0r
end
!
subroutine cftb1st(n, a, w)
integer n, j, j0, j1, j2, j3, k, m, mh
real*8 a(0 : n - 1), w(0 : *)
real*8 wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i
real*8 wd1r, wd1i, wd3r, wd3i
real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i
real*8 y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i
mh = n / 8
m = 2 * mh
j1 = m
j2 = j1 + m
j3 = j2 + m
x0r = a(0) + a(j2)
x0i = -a(1) - a(j2 + 1)
x1r = a(0) - a(j2)
x1i = -a(1) + a(j2 + 1)
x2r = a(j1) + a(j3)
x2i = a(j1 + 1) + a(j3 + 1)
x3r = a(j1) - a(j3)
x3i = a(j1 + 1) - a(j3 + 1)
a(0) = x0r + x2r
a(1) = x0i - x2i
a(j1) = x0r - x2r
a(j1 + 1) = x0i + x2i
a(j2) = x1r + x3i
a(j2 + 1) = x1i + x3r
a(j3) = x1r - x3i
a(j3 + 1) = x1i - x3r
wn4r = w(1)
csc1 = w(2)
csc3 = w(3)
wd1r = 1
wd1i = 0
wd3r = 1
wd3i = 0
k = 0
do j = 2, mh - 6, 4
k = k + 4
wk1r = csc1 * (wd1r + w(k))
wk1i = csc1 * (wd1i + w(k + 1))
wk3r = csc3 * (wd3r + w(k + 2))
wk3i = csc3 * (wd3i + w(k + 3))
wd1r = w(k)
wd1i = w(k + 1)
wd3r = w(k + 2)
wd3i = w(k + 3)
j1 = j + m
j2 = j1 + m
j3 = j2 + m
x0r = a(j) + a(j2)
x0i = -a(j + 1) - a(j2 + 1)
x1r = a(j) - a(j2)
x1i = -a(j + 1) + a(j2 + 1)
y0r = a(j + 2) + a(j2 + 2)
y0i = -a(j + 3) - a(j2 + 3)
y1r = a(j + 2) - a(j2 + 2)
y1i = -a(j + 3) + a(j2 + 3)
x2r = a(j1) + a(j3)
x2i = a(j1 + 1) + a(j3 + 1)
x3r = a(j1) - a(j3)
x3i = a(j1 + 1) - a(j3 + 1)
y2r = a(j1 + 2) + a(j3 + 2)
y2i = a(j1 + 3) + a(j3 + 3)
y3r = a(j1 + 2) - a(j3 + 2)
y3i = a(j1 + 3) - a(j3 + 3)
a(j) = x0r + x2r
a(j + 1) = x0i - x2i
a(j + 2) = y0r + y2r
a(j + 3) = y0i - y2i
a(j1) = x0r - x2r
a(j1 + 1) = x0i + x2i
a(j1 + 2) = y0r - y2r
a(j1 + 3) = y0i + y2i
x0r = x1r + x3i
x0i = x1i + x3r
a(j2) = wk1r * x0r - wk1i * x0i
a(j2 + 1) = wk1r * x0i + wk1i * x0r
x0r = y1r + y3i
x0i = y1i + y3r
a(j2 + 2) = wd1r * x0r - wd1i * x0i
a(j2 + 3) = wd1r * x0i + wd1i * x0r
x0r = x1r - x3i
x0i = x1i - x3r
a(j3) = wk3r * x0r + wk3i * x0i
a(j3 + 1) = wk3r * x0i - wk3i * x0r
x0r = y1r - y3i
x0i = y1i - y3r
a(j3 + 2) = wd3r * x0r + wd3i * x0i
a(j3 + 3) = wd3r * x0i - wd3i * x0r
j0 = m - j
j1 = j0 + m
j2 = j1 + m
j3 = j2 + m
x0r = a(j0) + a(j2)
x0i = -a(j0 + 1) - a(j2 + 1)
x1r = a(j0) - a(j2)
x1i = -a(j0 + 1) + a(j2 + 1)
y0r = a(j0 - 2) + a(j2 - 2)
y0i = -a(j0 - 1) - a(j2 - 1)
y1r = a(j0 - 2) - a(j2 - 2)
y1i = -a(j0 - 1) + a(j2 - 1)
x2r = a(j1) + a(j3)
x2i = a(j1 + 1) + a(j3 + 1)
x3r = a(j1) - a(j3)
x3i = a(j1 + 1) - a(j3 + 1)
y2r = a(j1 - 2) + a(j3 - 2)
y2i = a(j1 - 1) + a(j3 - 1)
y3r = a(j1 - 2) - a(j3 - 2)
y3i = a(j1 - 1) - a(j3 - 1)
a(j0) = x0r + x2r
a(j0 + 1) = x0i - x2i
a(j0 - 2) = y0r + y2r
a(j0 - 1) = y0i - y2i
a(j1) = x0r - x2r
a(j1 + 1) = x0i + x2i
a(j1 - 2) = y0r - y2r
a(j1 - 1) = y0i + y2i
x0r = x1r + x3i
x0i = x1i + x3r
a(j2) = wk1i * x0r - wk1r * x0i
a(j2 + 1) = wk1i * x0i + wk1r * x0r
x0r = y1r + y3i
x0i = y1i + y3r
a(j2 - 2) = wd1i * x0r - wd1r * x0i
a(j2 - 1) = wd1i * x0i + wd1r * x0r
x0r = x1r - x3i
x0i = x1i - x3r
a(j3) = wk3i * x0r + wk3r * x0i
a(j3 + 1) = wk3i * x0i - wk3r * x0r
x0r = y1r - y3i
x0i = y1i - y3r
a(j3 - 2) = wd3i * x0r + wd3r * x0i
a(j3 - 1) = wd3i * x0i - wd3r * x0r
end do
wk1r = csc1 * (wd1r + wn4r)
wk1i = csc1 * (wd1i + wn4r)
wk3r = csc3 * (wd3r - wn4r)
wk3i = csc3 * (wd3i - wn4r)
j0 = mh
j1 = j0 + m
j2 = j1 + m
j3 = j2 + m
x0r = a(j0 - 2) + a(j2 - 2)
x0i = -a(j0 - 1) - a(j2 - 1)
x1r = a(j0 - 2) - a(j2 - 2)
x1i = -a(j0 - 1) + a(j2 - 1)
x2r = a(j1 - 2) + a(j3 - 2)
x2i = a(j1 - 1) + a(j3 - 1)
x3r = a(j1 - 2) - a(j3 - 2)
x3i = a(j1 - 1) - a(j3 - 1)
a(j0 - 2) = x0r + x2r
a(j0 - 1) = x0i - x2i
a(j1 - 2) = x0r - x2r
a(j1 - 1) = x0i + x2i
x0r = x1r + x3i
x0i = x1i + x3r
a(j2 - 2) = wk1r * x0r - wk1i * x0i
a(j2 - 1) = wk1r * x0i + wk1i * x0r
x0r = x1r - x3i
x0i = x1i - x3r
a(j3 - 2) = wk3r * x0r + wk3i * x0i
a(j3 - 1) = wk3r * x0i - wk3i * x0r
x0r = a(j0) + a(j2)
x0i = -a(j0 + 1) - a(j2 + 1)
x1r = a(j0) - a(j2)
x1i = -a(j0 + 1) + a(j2 + 1)
x2r = a(j1) + a(j3)
x2i = a(j1 + 1) + a(j3 + 1)
x3r = a(j1) - a(j3)
x3i = a(j1 + 1) - a(j3 + 1)
a(j0) = x0r + x2r
a(j0 + 1) = x0i - x2i
a(j1) = x0r - x2r
a(j1 + 1) = x0i + x2i
x0r = x1r + x3i
x0i = x1i + x3r
a(j2) = wn4r * (x0r - x0i)
a(j2 + 1) = wn4r * (x0i + x0r)
x0r = x1r - x3i
x0i = x1i - x3r
a(j3) = -wn4r * (x0r + x0i)
a(j3 + 1) = -wn4r * (x0i - x0r)
x0r = a(j0 + 2) + a(j2 + 2)
x0i = -a(j0 + 3) - a(j2 + 3)
x1r = a(j0 + 2) - a(j2 + 2)
x1i = -a(j0 + 3) + a(j2 + 3)
x2r = a(j1 + 2) + a(j3 + 2)
x2i = a(j1 + 3) + a(j3 + 3)
x3r = a(j1 + 2) - a(j3 + 2)
x3i = a(j1 + 3) - a(j3 + 3)
a(j0 + 2) = x0r + x2r
a(j0 + 3) = x0i - x2i
a(j1 + 2) = x0r - x2r
a(j1 + 3) = x0i + x2i
x0r = x1r + x3i
x0i = x1i + x3r
a(j2 + 2) = wk1i * x0r - wk1r * x0i
a(j2 + 3) = wk1i * x0i + wk1r * x0r
x0r = x1r - x3i
x0i = x1i - x3r
a(j3 + 2) = wk3i * x0r + wk3r * x0i
a(j3 + 3) = wk3i * x0i - wk3r * x0r
end
!
subroutine cftrec4(n, a, nw, w)
integer n, nw, cfttree, isplt, j, k, m
real*8 a(0 : n - 1), w(0 : nw - 1)
m = n
do while (m .gt. 512)
m = m / 4
call cftmdl1(m, a(n - m), w(nw - m / 2))
end do
call cftleaf(m, 1, a(n - m), nw, w)
k = 0
do j = n - m, m, -m
k = k + 1
isplt = cfttree(m, j, k, a, nw, w)
call cftleaf(m, isplt, a(j - m), nw, w)
end do
end
!
integer function cfttree(n, j, k, a, nw, w)
integer n, j, k, nw, i, isplt, m
real*8 a(0 : j - 1), w(0 : nw - 1)
if (mod(k, 4) .ne. 0) then
isplt = mod(k, 2)
if (isplt .ne. 0) then
call cftmdl1(n, a(j - n), w(nw - n / 2))
else
call cftmdl2(n, a(j - n), w(nw - n))
end if
else
m = n
i = k
do while (mod(i, 4) .eq. 0)
m = m * 4
i = i / 4
end do
isplt = mod(i, 2)
if (isplt .ne. 0) then
do while (m .gt. 128)
call cftmdl1(m, a(j - m), w(nw - m / 2))
m = m / 4
end do
else
do while (m .gt. 128)
call cftmdl2(m, a(j - m), w(nw - m))
m = m / 4
end do
end if
end if
cfttree = isplt
end
!
subroutine cftleaf(n, isplt, a, nw, w)
integer n, isplt, nw
real*8 a(0 : n - 1), w(0 : nw - 1)
if (n .eq. 512) then
call cftmdl1(128, a, w(nw - 64))
call cftf161(a, w(nw - 8))
call cftf162(a(32), w(nw - 32))
call cftf161(a(64), w(nw - 8))
call cftf161(a(96), w(nw - 8))
call cftmdl2(128, a(128), w(nw - 128))
call cftf161(a(128), w(nw - 8))
call cftf162(a(160), w(nw - 32))
call cftf161(a(192), w(nw - 8))
call cftf162(a(224), w(nw - 32))
call cftmdl1(128, a(256), w(nw - 64))
call cftf161(a(256), w(nw - 8))
call cftf162(a(288), w(nw - 32))
call cftf161(a(320), w(nw - 8))
call cftf161(a(352), w(nw - 8))
if (isplt .ne. 0) then
call cftmdl1(128, a(384), w(nw - 64))
call cftf161(a(480), w(nw - 8))
else
call cftmdl2(128, a(384), w(nw - 128))
call cftf162(a(480), w(nw - 32))
end if
call cftf161(a(384), w(nw - 8))
call cftf162(a(416), w(nw - 32))
call cftf161(a(448), w(nw - 8))
else
call cftmdl1(64, a, w(nw - 32))
call cftf081(a, w(nw - 8))
call cftf082(a(16), w(nw - 8))
call cftf081(a(32), w(nw - 8))
call cftf081(a(48), w(nw - 8))
call cftmdl2(64, a(64), w(nw - 64))
call cftf081(a(64), w(nw - 8))
call cftf082(a(80), w(nw - 8))
call cftf081(a(96), w(nw - 8))
call cftf082(a(112), w(nw - 8))
call cftmdl1(64, a(128), w(nw - 32))
call cftf081(a(128), w(nw - 8))
call cftf082(a(144), w(nw - 8))
call cftf081(a(160), w(nw - 8))
call cftf081(a(176), w(nw - 8))
if (isplt .ne. 0) then
call cftmdl1(64, a(192), w(nw - 32))
call cftf081(a(240), w(nw - 8))
else
call cftmdl2(64, a(192), w(nw - 64))
call cftf082(a(240), w(nw - 8))
end if
call cftf081(a(192), w(nw - 8))
call cftf082(a(208), w(nw - 8))
call cftf081(a(224), w(nw - 8))
end if
end
!
subroutine cftmdl1(n, a, w)
integer n, j, j0, j1, j2, j3, k, m, mh
real*8 a(0 : n - 1), w(0 : *)
real*8 wn4r, wk1r, wk1i, wk3r, wk3i
real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i
mh = n / 8
m = 2 * mh
j1 = m
j2 = j1 + m
j3 = j2 + m
x0r = a(0) + a(j2)
x0i = a(1) + a(j2 + 1)
x1r = a(0) - a(j2)
x1i = a(1) - a(j2 + 1)
x2r = a(j1) + a(j3)
x2i = a(j1 + 1) + a(j3 + 1)
x3r = a(j1) - a(j3)
x3i = a(j1 + 1) - a(j3 + 1)
a(0) = x0r + x2r
a(1) = x0i + x2i
a(j1) = x0r - x2r
a(j1 + 1) = x0i - x2i
a(j2) = x1r - x3i
a(j2 + 1) = x1i + x3r
a(j3) = x1r + x3i
a(j3 + 1) = x1i - x3r
wn4r = w(1)
k = 0
do j = 2, mh - 2, 2
k = k + 4
wk1r = w(k)
wk1i = w(k + 1)
wk3r = w(k + 2)
wk3i = w(k + 3)
j1 = j + m
j2 = j1 + m
j3 = j2 + m
x0r = a(j) + a(j2)
x0i = a(j + 1) + a(j2 + 1)
x1r = a(j) - a(j2)
x1i = a(j + 1) - a(j2 + 1)
x2r = a(j1) + a(j3)
x2i = a(j1 + 1) + a(j3 + 1)
x3r = a(j1) - a(j3)
x3i = a(j1 + 1) - a(j3 + 1)
a(j) = x0r + x2r
a(j + 1) = x0i + x2i
a(j1) = x0r - x2r
a(j1 + 1) = x0i - x2i
x0r = x1r - x3i
x0i = x1i + x3r
a(j2) = wk1r * x0r - wk1i * x0i
a(j2 + 1) = wk1r * x0i + wk1i * x0r
x0r = x1r + x3i
x0i = x1i - x3r
a(j3) = wk3r * x0r + wk3i * x0i
a(j3 + 1) = wk3r * x0i - wk3i * x0r
j0 = m - j
j1 = j0 + m
j2 = j1 + m
j3 = j2 + m
x0r = a(j0) + a(j2)
x0i = a(j0 + 1) + a(j2 + 1)
x1r = a(j0) - a(j2)
x1i = a(j0 + 1) - a(j2 + 1)
x2r = a(j1) + a(j3)
x2i = a(j1 + 1) + a(j3 + 1)
x3r = a(j1) - a(j3)
x3i = a(j1 + 1) - a(j3 + 1)
a(j0) = x0r + x2r
a(j0 + 1) = x0i + x2i
a(j1) = x0r - x2r
a(j1 + 1) = x0i - x2i
x0r = x1r - x3i
x0i = x1i + x3r
a(j2) = wk1i * x0r - wk1r * x0i
a(j2 + 1) = wk1i * x0i + wk1r * x0r
x0r = x1r + x3i
x0i = x1i - x3r
a(j3) = wk3i * x0r + wk3r * x0i
a(j3 + 1) = wk3i * x0i - wk3r * x0r
end do
j0 = mh
j1 = j0 + m
j2 = j1 + m
j3 = j2 + m
x0r = a(j0) + a(j2)
x0i = a(j0 + 1) + a(j2 + 1)
x1r = a(j0) - a(j2)
x1i = a(j0 + 1) - a(j2 + 1)
x2r = a(j1) + a(j3)
x2i = a(j1 + 1) + a(j3 + 1)
x3r = a(j1) - a(j3)
x3i = a(j1 + 1) - a(j3 + 1)
a(j0) = x0r + x2r
a(j0 + 1) = x0i + x2i
a(j1) = x0r - x2r
a(j1 + 1) = x0i - x2i
x0r = x1r - x3i
x0i = x1i + x3r
a(j2) = wn4r * (x0r - x0i)
a(j2 + 1) = wn4r * (x0i + x0r)
x0r = x1r + x3i
x0i = x1i - x3r
a(j3) = -wn4r * (x0r + x0i)
a(j3 + 1) = -wn4r * (x0i - x0r)
end
!
subroutine cftmdl2(n, a, w)
integer n, j, j0, j1, j2, j3, k, kr, m, mh
real*8 a(0 : n - 1), w(0 : *)
real*8 wn4r, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i
real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i
real*8 y0r, y0i, y2r, y2i
mh = n / 8
m = 2 * mh
wn4r = w(1)
j1 = m
j2 = j1 + m
j3 = j2 + m
x0r = a(0) - a(j2 + 1)
x0i = a(1) + a(j2)
x1r = a(0) + a(j2 + 1)
x1i = a(1) - a(j2)
x2r = a(j1) - a(j3 + 1)
x2i = a(j1 + 1) + a(j3)
x3r = a(j1) + a(j3 + 1)
x3i = a(j1 + 1) - a(j3)
y0r = wn4r * (x2r - x2i)
y0i = wn4r * (x2i + x2r)
a(0) = x0r + y0r
a(1) = x0i + y0i
a(j1) = x0r - y0r
a(j1 + 1) = x0i - y0i
y0r = wn4r * (x3r - x3i)
y0i = wn4r * (x3i + x3r)
a(j2) = x1r - y0i
a(j2 + 1) = x1i + y0r
a(j3) = x1r + y0i
a(j3 + 1) = x1i - y0r
k = 0
kr = 2 * m
do j = 2, mh - 2, 2
k = k + 4
wk1r = w(k)
wk1i = w(k + 1)
wk3r = w(k + 2)
wk3i = w(k + 3)
kr = kr - 4
wd1i = w(kr)
wd1r = w(kr + 1)
wd3i = w(kr + 2)
wd3r = w(kr + 3)
j1 = j + m
j2 = j1 + m
j3 = j2 + m
x0r = a(j) - a(j2 + 1)
x0i = a(j + 1) + a(j2)
x1r = a(j) + a(j2 + 1)
x1i = a(j + 1) - a(j2)
x2r = a(j1) - a(j3 + 1)
x2i = a(j1 + 1) + a(j3)
x3r = a(j1) + a(j3 + 1)
x3i = a(j1 + 1) - a(j3)
y0r = wk1r * x0r - wk1i * x0i
y0i = wk1r * x0i + wk1i * x0r
y2r = wd1r * x2r - wd1i * x2i
y2i = wd1r * x2i + wd1i * x2r
a(j) = y0r + y2r
a(j + 1) = y0i + y2i
a(j1) = y0r - y2r
a(j1 + 1) = y0i - y2i
y0r = wk3r * x1r + wk3i * x1i
y0i = wk3r * x1i - wk3i * x1r
y2r = wd3r * x3r + wd3i * x3i
y2i = wd3r * x3i - wd3i * x3r
a(j2) = y0r + y2r
a(j2 + 1) = y0i + y2i
a(j3) = y0r - y2r
a(j3 + 1) = y0i - y2i
j0 = m - j
j1 = j0 + m
j2 = j1 + m
j3 = j2 + m
x0r = a(j0) - a(j2 + 1)
x0i = a(j0 + 1) + a(j2)
x1r = a(j0) + a(j2 + 1)
x1i = a(j0 + 1) - a(j2)
x2r = a(j1) - a(j3 + 1)
x2i = a(j1 + 1) + a(j3)
x3r = a(j1) + a(j3 + 1)
x3i = a(j1 + 1) - a(j3)
y0r = wd1i * x0r - wd1r * x0i
y0i = wd1i * x0i + wd1r * x0r
y2r = wk1i * x2r - wk1r * x2i
y2i = wk1i * x2i + wk1r * x2r
a(j0) = y0r + y2r
a(j0 + 1) = y0i + y2i
a(j1) = y0r - y2r
a(j1 + 1) = y0i - y2i
y0r = wd3i * x1r + wd3r * x1i
y0i = wd3i * x1i - wd3r * x1r
y2r = wk3i * x3r + wk3r * x3i
y2i = wk3i * x3i - wk3r * x3r
a(j2) = y0r + y2r
a(j2 + 1) = y0i + y2i
a(j3) = y0r - y2r
a(j3 + 1) = y0i - y2i
end do
wk1r = w(m)
wk1i = w(m + 1)
j0 = mh
j1 = j0 + m
j2 = j1 + m
j3 = j2 + m
x0r = a(j0) - a(j2 + 1)
x0i = a(j0 + 1) + a(j2)
x1r = a(j0) + a(j2 + 1)
x1i = a(j0 + 1) - a(j2)
x2r = a(j1) - a(j3 + 1)
x2i = a(j1 + 1) + a(j3)
x3r = a(j1) + a(j3 + 1)
x3i = a(j1 + 1) - a(j3)
y0r = wk1r * x0r - wk1i * x0i
y0i = wk1r * x0i + wk1i * x0r
y2r = wk1i * x2r - wk1r * x2i
y2i = wk1i * x2i + wk1r * x2r
a(j0) = y0r + y2r
a(j0 + 1) = y0i + y2i
a(j1) = y0r - y2r
a(j1 + 1) = y0i - y2i
y0r = wk1i * x1r - wk1r * x1i
y0i = wk1i * x1i + wk1r * x1r
y2r = wk1r * x3r - wk1i * x3i
y2i = wk1r * x3i + wk1i * x3r
a(j2) = y0r - y2r
a(j2 + 1) = y0i - y2i
a(j3) = y0r + y2r
a(j3 + 1) = y0i + y2i
end
!
subroutine cftfx41(n, a, nw, w)
integer n, nw
real*8 a(0 : n - 1), w(0 : nw - 1)
if (n .eq. 128) then
call cftf161(a, w(nw - 8))
call cftf162(a(32), w(nw - 32))
call cftf161(a(64), w(nw - 8))
call cftf161(a(96), w(nw - 8))
else
call cftf081(a, w(nw - 8))
call cftf082(a(16), w(nw - 8))
call cftf081(a(32), w(nw - 8))
call cftf081(a(48), w(nw - 8))
end if
end
!
subroutine cftf161(a, w)
real*8 a(0 : 31), w(0 : *), wn4r, wk1r, wk1i
real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i
real*8 y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i
real*8 y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i
real*8 y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i
real*8 y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i
wn4r = w(1)
wk1r = w(2)
wk1i = w(3)
x0r = a(0) + a(16)
x0i = a(1) + a(17)
x1r = a(0) - a(16)
x1i = a(1) - a(17)
x2r = a(8) + a(24)
x2i = a(9) + a(25)
x3r = a(8) - a(24)
x3i = a(9) - a(25)
y0r = x0r + x2r
y0i = x0i + x2i
y4r = x0r - x2r
y4i = x0i - x2i
y8r = x1r - x3i
y8i = x1i + x3r
y12r = x1r + x3i
y12i = x1i - x3r
x0r = a(2) + a(18)
x0i = a(3) + a(19)
x1r = a(2) - a(18)
x1i = a(3) - a(19)
x2r = a(10) + a(26)
x2i = a(11) + a(27)
x3r = a(10) - a(26)
x3i = a(11) - a(27)
y1r = x0r + x2r
y1i = x0i + x2i
y5r = x0r - x2r
y5i = x0i - x2i
x0r = x1r - x3i
x0i = x1i + x3r
y9r = wk1r * x0r - wk1i * x0i
y9i = wk1r * x0i + wk1i * x0r
x0r = x1r + x3i
x0i = x1i - x3r
y13r = wk1i * x0r - wk1r * x0i
y13i = wk1i * x0i + wk1r * x0r
x0r = a(4) + a(20)
x0i = a(5) + a(21)
x1r = a(4) - a(20)
x1i = a(5) - a(21)
x2r = a(12) + a(28)
x2i = a(13) + a(29)
x3r = a(12) - a(28)
x3i = a(13) - a(29)
y2r = x0r + x2r
y2i = x0i + x2i
y6r = x0r - x2r
y6i = x0i - x2i
x0r = x1r - x3i
x0i = x1i + x3r
y10r = wn4r * (x0r - x0i)
y10i = wn4r * (x0i + x0r)
x0r = x1r + x3i
x0i = x1i - x3r
y14r = wn4r * (x0r + x0i)
y14i = wn4r * (x0i - x0r)
x0r = a(6) + a(22)
x0i = a(7) + a(23)
x1r = a(6) - a(22)
x1i = a(7) - a(23)
x2r = a(14) + a(30)
x2i = a(15) + a(31)
x3r = a(14) - a(30)
x3i = a(15) - a(31)
y3r = x0r + x2r
y3i = x0i + x2i
y7r = x0r - x2r
y7i = x0i - x2i
x0r = x1r - x3i
x0i = x1i + x3r
y11r = wk1i * x0r - wk1r * x0i
y11i = wk1i * x0i + wk1r * x0r
x0r = x1r + x3i
x0i = x1i - x3r
y15r = wk1r * x0r - wk1i * x0i
y15i = wk1r * x0i + wk1i * x0r
x0r = y12r - y14r
x0i = y12i - y14i
x1r = y12r + y14r
x1i = y12i + y14i
x2r = y13r - y15r
x2i = y13i - y15i
x3r = y13r + y15r
x3i = y13i + y15i
a(24) = x0r + x2r
a(25) = x0i + x2i
a(26) = x0r - x2r
a(27) = x0i - x2i
a(28) = x1r - x3i
a(29) = x1i + x3r
a(30) = x1r + x3i
a(31) = x1i - x3r
x0r = y8r + y10r
x0i = y8i + y10i
x1r = y8r - y10r
x1i = y8i - y10i
x2r = y9r + y11r
x2i = y9i + y11i
x3r = y9r - y11r
x3i = y9i - y11i
a(16) = x0r + x2r
a(17) = x0i + x2i
a(18) = x0r - x2r
a(19) = x0i - x2i
a(20) = x1r - x3i
a(21) = x1i + x3r
a(22) = x1r + x3i
a(23) = x1i - x3r
x0r = y5r - y7i
x0i = y5i + y7r
x2r = wn4r * (x0r - x0i)
x2i = wn4r * (x0i + x0r)
x0r = y5r + y7i
x0i = y5i - y7r
x3r = wn4r * (x0r - x0i)
x3i = wn4r * (x0i + x0r)
x0r = y4r - y6i
x0i = y4i + y6r
x1r = y4r + y6i
x1i = y4i - y6r
a(8) = x0r + x2r
a(9) = x0i + x2i
a(10) = x0r - x2r
a(11) = x0i - x2i
a(12) = x1r - x3i
a(13) = x1i + x3r
a(14) = x1r + x3i
a(15) = x1i - x3r
x0r = y0r + y2r
x0i = y0i + y2i
x1r = y0r - y2r
x1i = y0i - y2i
x2r = y1r + y3r
x2i = y1i + y3i
x3r = y1r - y3r
x3i = y1i - y3i
a(0) = x0r + x2r
a(1) = x0i + x2i
a(2) = x0r - x2r
a(3) = x0i - x2i
a(4) = x1r - x3i
a(5) = x1i + x3r
a(6) = x1r + x3i
a(7) = x1i - x3r
end
!
subroutine cftf162(a, w)
real*8 a(0 : 31), w(0 : *)
real*8 wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i
real*8 x0r, x0i, x1r, x1i, x2r, x2i
real*8 y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i
real*8 y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i
real*8 y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i
real*8 y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i
wn4r = w(1)
wk1r = w(4)
wk1i = w(5)
wk3r = w(6)
wk3i = -w(7)
wk2r = w(8)
wk2i = w(9)
x1r = a(0) - a(17)
x1i = a(1) + a(16)
x0r = a(8) - a(25)
x0i = a(9) + a(24)
x2r = wn4r * (x0r - x0i)
x2i = wn4r * (x0i + x0r)
y0r = x1r + x2r
y0i = x1i + x2i
y4r = x1r - x2r
y4i = x1i - x2i
x1r = a(0) + a(17)
x1i = a(1) - a(16)
x0r = a(8) + a(25)
x0i = a(9) - a(24)
x2r = wn4r * (x0r - x0i)
x2i = wn4r * (x0i + x0r)
y8r = x1r - x2i
y8i = x1i + x2r
y12r = x1r + x2i
y12i = x1i - x2r
x0r = a(2) - a(19)
x0i = a(3) + a(18)
x1r = wk1r * x0r - wk1i * x0i
x1i = wk1r * x0i + wk1i * x0r
x0r = a(10) - a(27)
x0i = a(11) + a(26)
x2r = wk3i * x0r - wk3r * x0i
x2i = wk3i * x0i + wk3r * x0r
y1r = x1r + x2r
y1i = x1i + x2i
y5r = x1r - x2r
y5i = x1i - x2i
x0r = a(2) + a(19)
x0i = a(3) - a(18)
x1r = wk3r * x0r - wk3i * x0i
x1i = wk3r * x0i + wk3i * x0r
x0r = a(10) + a(27)
x0i = a(11) - a(26)
x2r = wk1r * x0r + wk1i * x0i
x2i = wk1r * x0i - wk1i * x0r
y9r = x1r - x2r
y9i = x1i - x2i
y13r = x1r + x2r
y13i = x1i + x2i
x0r = a(4) - a(21)
x0i = a(5) + a(20)
x1r = wk2r * x0r - wk2i * x0i
x1i = wk2r * x0i + wk2i * x0r
x0r = a(12) - a(29)
x0i = a(13) + a(28)
x2r = wk2i * x0r - wk2r * x0i
x2i = wk2i * x0i + wk2r * x0r
y2r = x1r + x2r
y2i = x1i + x2i
y6r = x1r - x2r
y6i = x1i - x2i
x0r = a(4) + a(21)
x0i = a(5) - a(20)
x1r = wk2i * x0r - wk2r * x0i
x1i = wk2i * x0i + wk2r * x0r
x0r = a(12) + a(29)
x0i = a(13) - a(28)
x2r = wk2r * x0r - wk2i * x0i
x2i = wk2r * x0i + wk2i * x0r
y10r = x1r - x2r
y10i = x1i - x2i
y14r = x1r + x2r
y14i = x1i + x2i
x0r = a(6) - a(23)
x0i = a(7) + a(22)
x1r = wk3r * x0r - wk3i * x0i
x1i = wk3r * x0i + wk3i * x0r
x0r = a(14) - a(31)
x0i = a(15) + a(30)
x2r = wk1i * x0r - wk1r * x0i
x2i = wk1i * x0i + wk1r * x0r
y3r = x1r + x2r
y3i = x1i + x2i
y7r = x1r - x2r
y7i = x1i - x2i
x0r = a(6) + a(23)
x0i = a(7) - a(22)
x1r = wk1i * x0r + wk1r * x0i
x1i = wk1i * x0i - wk1r * x0r
x0r = a(14) + a(31)
x0i = a(15) - a(30)
x2r = wk3i * x0r - wk3r * x0i
x2i = wk3i * x0i + wk3r * x0r
y11r = x1r + x2r
y11i = x1i + x2i
y15r = x1r - x2r
y15i = x1i - x2i
x1r = y0r + y2r
x1i = y0i + y2i
x2r = y1r + y3r
x2i = y1i + y3i
a(0) = x1r + x2r
a(1) = x1i + x2i
a(2) = x1r - x2r
a(3) = x1i - x2i
x1r = y0r - y2r
x1i = y0i - y2i
x2r = y1r - y3r
x2i = y1i - y3i
a(4) = x1r - x2i
a(5) = x1i + x2r
a(6) = x1r + x2i
a(7) = x1i - x2r
x1r = y4r - y6i
x1i = y4i + y6r
x0r = y5r - y7i
x0i = y5i + y7r
x2r = wn4r * (x0r - x0i)
x2i = wn4r * (x0i + x0r)
a(8) = x1r + x2r
a(9) = x1i + x2i
a(10) = x1r - x2r
a(11) = x1i - x2i
x1r = y4r + y6i
x1i = y4i - y6r
x0r = y5r + y7i
x0i = y5i - y7r
x2r = wn4r * (x0r - x0i)
x2i = wn4r * (x0i + x0r)
a(12) = x1r - x2i
a(13) = x1i + x2r
a(14) = x1r + x2i
a(15) = x1i - x2r
x1r = y8r + y10r
x1i = y8i + y10i
x2r = y9r - y11r
x2i = y9i - y11i
a(16) = x1r + x2r
a(17) = x1i + x2i
a(18) = x1r - x2r
a(19) = x1i - x2i
x1r = y8r - y10r
x1i = y8i - y10i
x2r = y9r + y11r
x2i = y9i + y11i
a(20) = x1r - x2i
a(21) = x1i + x2r
a(22) = x1r + x2i
a(23) = x1i - x2r
x1r = y12r - y14i
x1i = y12i + y14r
x0r = y13r + y15i
x0i = y13i - y15r
x2r = wn4r * (x0r - x0i)
x2i = wn4r * (x0i + x0r)
a(24) = x1r + x2r
a(25) = x1i + x2i
a(26) = x1r - x2r
a(27) = x1i - x2i
x1r = y12r + y14i
x1i = y12i - y14r
x0r = y13r - y15i
x0i = y13i + y15r
x2r = wn4r * (x0r - x0i)
x2i = wn4r * (x0i + x0r)
a(28) = x1r - x2i
a(29) = x1i + x2r
a(30) = x1r + x2i
a(31) = x1i - x2r
end
!
subroutine cftf081(a, w)
real*8 a(0 : 15), w(0 : *)
real*8 wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i
real*8 y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i
real*8 y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i
wn4r = w(1)
x0r = a(0) + a(8)
x0i = a(1) + a(9)
x1r = a(0) - a(8)
x1i = a(1) - a(9)
x2r = a(4) + a(12)
x2i = a(5) + a(13)
x3r = a(4) - a(12)
x3i = a(5) - a(13)
y0r = x0r + x2r
y0i = x0i + x2i
y2r = x0r - x2r
y2i = x0i - x2i
y1r = x1r - x3i
y1i = x1i + x3r
y3r = x1r + x3i
y3i = x1i - x3r
x0r = a(2) + a(10)
x0i = a(3) + a(11)
x1r = a(2) - a(10)
x1i = a(3) - a(11)
x2r = a(6) + a(14)
x2i = a(7) + a(15)
x3r = a(6) - a(14)
x3i = a(7) - a(15)
y4r = x0r + x2r
y4i = x0i + x2i
y6r = x0r - x2r
y6i = x0i - x2i
x0r = x1r - x3i
x0i = x1i + x3r
x2r = x1r + x3i
x2i = x1i - x3r
y5r = wn4r * (x0r - x0i)
y5i = wn4r * (x0r + x0i)
y7r = wn4r * (x2r - x2i)
y7i = wn4r * (x2r + x2i)
a(8) = y1r + y5r
a(9) = y1i + y5i
a(10) = y1r - y5r
a(11) = y1i - y5i
a(12) = y3r - y7i
a(13) = y3i + y7r
a(14) = y3r + y7i
a(15) = y3i - y7r
a(0) = y0r + y4r
a(1) = y0i + y4i
a(2) = y0r - y4r
a(3) = y0i - y4i
a(4) = y2r - y6i
a(5) = y2i + y6r
a(6) = y2r + y6i
a(7) = y2i - y6r
end
!
subroutine cftf082(a, w)
real*8 a(0 : 15), w(0 : *)
real*8 wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i
real*8 y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i
real*8 y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i
wn4r = w(1)
wk1r = w(2)
wk1i = w(3)
y0r = a(0) - a(9)
y0i = a(1) + a(8)
y1r = a(0) + a(9)
y1i = a(1) - a(8)
x0r = a(4) - a(13)
x0i = a(5) + a(12)
y2r = wn4r * (x0r - x0i)
y2i = wn4r * (x0i + x0r)
x0r = a(4) + a(13)
x0i = a(5) - a(12)
y3r = wn4r * (x0r - x0i)
y3i = wn4r * (x0i + x0r)
x0r = a(2) - a(11)
x0i = a(3) + a(10)
y4r = wk1r * x0r - wk1i * x0i
y4i = wk1r * x0i + wk1i * x0r
x0r = a(2) + a(11)
x0i = a(3) - a(10)
y5r = wk1i * x0r - wk1r * x0i
y5i = wk1i * x0i + wk1r * x0r
x0r = a(6) - a(15)
x0i = a(7) + a(14)
y6r = wk1i * x0r - wk1r * x0i
y6i = wk1i * x0i + wk1r * x0r
x0r = a(6) + a(15)
x0i = a(7) - a(14)
y7r = wk1r * x0r - wk1i * x0i
y7i = wk1r * x0i + wk1i * x0r
x0r = y0r + y2r
x0i = y0i + y2i
x1r = y4r + y6r
x1i = y4i + y6i
a(0) = x0r + x1r
a(1) = x0i + x1i
a(2) = x0r - x1r
a(3) = x0i - x1i
x0r = y0r - y2r
x0i = y0i - y2i
x1r = y4r - y6r
x1i = y4i - y6i
a(4) = x0r - x1i
a(5) = x0i + x1r
a(6) = x0r + x1i
a(7) = x0i - x1r
x0r = y1r - y3i
x0i = y1i + y3r
x1r = y5r - y7r
x1i = y5i - y7i
a(8) = x0r + x1r
a(9) = x0i + x1i
a(10) = x0r - x1r
a(11) = x0i - x1i
x0r = y1r + y3i
x0i = y1i - y3r
x1r = y5r + y7r
x1i = y5i + y7i
a(12) = x0r - x1i
a(13) = x0i + x1r
a(14) = x0r + x1i
a(15) = x0i - x1r
end
!
subroutine cftf040(a)
real*8 a(0 : 7), x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i
x0r = a(0) + a(4)
x0i = a(1) + a(5)
x1r = a(0) - a(4)
x1i = a(1) - a(5)
x2r = a(2) + a(6)
x2i = a(3) + a(7)
x3r = a(2) - a(6)
x3i = a(3) - a(7)
a(0) = x0r + x2r
a(1) = x0i + x2i
a(2) = x1r - x3i
a(3) = x1i + x3r
a(4) = x0r - x2r
a(5) = x0i - x2i
a(6) = x1r + x3i
a(7) = x1i - x3r
end
!
subroutine cftb040(a)
real*8 a(0 : 7), x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i
x0r = a(0) + a(4)
x0i = a(1) + a(5)
x1r = a(0) - a(4)
x1i = a(1) - a(5)
x2r = a(2) + a(6)
x2i = a(3) + a(7)
x3r = a(2) - a(6)
x3i = a(3) - a(7)
a(0) = x0r + x2r
a(1) = x0i + x2i
a(2) = x1r + x3i
a(3) = x1i - x3r
a(4) = x0r - x2r
a(5) = x0i - x2i
a(6) = x1r - x3i
a(7) = x1i + x3r
end
!
subroutine cftx020(a)
real*8 a(0 : 3), x0r, x0i
x0r = a(0) - a(2)
x0i = a(1) - a(3)
a(0) = a(0) + a(2)
a(1) = a(1) + a(3)
a(2) = x0r
a(3) = x0i
end
!
subroutine rftfsub(n, a, nc, c)
integer n, nc, j, k, kk, ks, m
real*8 a(0 : n - 1), c(0 : nc - 1), wkr, wki, xr, xi, yr, yi
m = n / 2
ks = 2 * nc / m
kk = 0
do j = 2, m - 2, 2
k = n - j
kk = kk + ks
wkr = 0.5d0 - c(nc - kk)
wki = c(kk)
xr = a(j) - a(k)
xi = a(j + 1) + a(k + 1)
yr = wkr * xr - wki * xi
yi = wkr * xi + wki * xr
a(j) = a(j) - yr
a(j + 1) = a(j + 1) - yi
a(k) = a(k) + yr
a(k + 1) = a(k + 1) - yi
end do
end
!
subroutine rftbsub(n, a, nc, c)
integer n, nc, j, k, kk, ks, m
real*8 a(0 : n - 1), c(0 : nc - 1), wkr, wki, xr, xi, yr, yi
m = n / 2
ks = 2 * nc / m
kk = 0
do j = 2, m - 2, 2
k = n - j
kk = kk + ks
wkr = 0.5d0 - c(nc - kk)
wki = c(kk)
xr = a(j) - a(k)
xi = a(j + 1) + a(k + 1)
yr = wkr * xr + wki * xi
yi = wkr * xi - wki * xr
a(j) = a(j) - yr
a(j + 1) = a(j + 1) - yi
a(k) = a(k) + yr
a(k + 1) = a(k + 1) - yi
end do
end
!
subroutine dctsub(n, a, nc, c)
integer n, nc, j, k, kk, ks, m
real*8 a(0 : n - 1), c(0 : nc - 1), wkr, wki, xr
m = n / 2
ks = nc / n
kk = 0
do j = 1, m - 1
k = n - j
kk = kk + ks
wkr = c(kk) - c(nc - kk)
wki = c(kk) + c(nc - kk)
xr = wki * a(j) - wkr * a(k)
a(j) = wkr * a(j) + wki * a(k)
a(k) = xr
end do
a(m) = c(0) * a(m)
end
!
subroutine dstsub(n, a, nc, c)
integer n, nc, j, k, kk, ks, m
real*8 a(0 : n - 1), c(0 : nc - 1), wkr, wki, xr
m = n / 2
ks = nc / n
kk = 0
do j = 1, m - 1
k = n - j
kk = kk + ks
wkr = c(kk) - c(nc - kk)
wki = c(kk) + c(nc - kk)
xr = wki * a(k) - wkr * a(j)
a(k) = wkr * a(k) + wki * a(j)
a(j) = xr
end do
a(m) = c(0) * a(m)
end
!