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