| ! 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 |
| ! |