📄 fft4g.f
字号:
a(k1 + 1) = -a(k1 + 1) a(k1 + m2 + 1) = -a(k1 + m2 + 1) end do end if end! subroutine cftfsub(n, a, w) integer n, j, j1, j2, j3, l real*8 a(0 : n - 1), w(0 : *) real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i l = 2 if (n .gt. 8) then call cft1st(n, a, w) l = 8 do while (4 * l .lt. n) call cftmdl(n, l, a, w) l = 4 * l end do end if if (4 * l .eq. n) then do j = 0, l - 2, 2 j1 = j + l j2 = j1 + l j3 = j2 + l x0r = a(j) + a(j1) x0i = a(j + 1) + a(j1 + 1) x1r = a(j) - a(j1) x1i = a(j + 1) - a(j1 + 1) x2r = a(j2) + a(j3) x2i = a(j2 + 1) + a(j3 + 1) x3r = a(j2) - a(j3) x3i = a(j2 + 1) - a(j3 + 1) a(j) = x0r + x2r a(j + 1) = x0i + x2i a(j2) = x0r - x2r a(j2 + 1) = x0i - x2i a(j1) = x1r - x3i a(j1 + 1) = x1i + x3r a(j3) = x1r + x3i a(j3 + 1) = x1i - x3r end do else do j = 0, l - 2, 2 j1 = j + l x0r = a(j) - a(j1) x0i = a(j + 1) - a(j1 + 1) a(j) = a(j) + a(j1) a(j + 1) = a(j + 1) + a(j1 + 1) a(j1) = x0r a(j1 + 1) = x0i end do end if end! subroutine cftbsub(n, a, w) integer n, j, j1, j2, j3, l real*8 a(0 : n - 1), w(0 : *) real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i l = 2 if (n .gt. 8) then call cft1st(n, a, w) l = 8 do while (4 * l .lt. n) call cftmdl(n, l, a, w) l = 4 * l end do end if if (4 * l .eq. n) then do j = 0, l - 2, 2 j1 = j + l j2 = j1 + l j3 = j2 + l x0r = a(j) + a(j1) x0i = -a(j + 1) - a(j1 + 1) x1r = a(j) - a(j1) x1i = -a(j + 1) + a(j1 + 1) x2r = a(j2) + a(j3) x2i = a(j2 + 1) + a(j3 + 1) x3r = a(j2) - a(j3) x3i = a(j2 + 1) - a(j3 + 1) a(j) = x0r + x2r a(j + 1) = x0i - x2i a(j2) = x0r - x2r a(j2 + 1) = x0i + x2i a(j1) = x1r - x3i a(j1 + 1) = x1i - x3r a(j3) = x1r + x3i a(j3 + 1) = x1i + x3r end do else do j = 0, l - 2, 2 j1 = j + l x0r = a(j) - a(j1) x0i = -a(j + 1) + a(j1 + 1) a(j) = a(j) + a(j1) a(j + 1) = -a(j + 1) - a(j1 + 1) a(j1) = x0r a(j1 + 1) = x0i end do end if end! subroutine cft1st(n, a, w) integer n, j, k1, k2 real*8 a(0 : n - 1), w(0 : *) real*8 wk1r, wk1i, wk2r, wk2i, wk3r, wk3i real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i x0r = a(0) + a(2) x0i = a(1) + a(3) x1r = a(0) - a(2) x1i = a(1) - a(3) x2r = a(4) + a(6) x2i = a(5) + a(7) x3r = a(4) - a(6) x3i = a(5) - a(7) a(0) = x0r + x2r a(1) = x0i + x2i a(4) = x0r - x2r a(5) = x0i - x2i a(2) = x1r - x3i a(3) = x1i + x3r a(6) = x1r + x3i a(7) = x1i - x3r wk1r = w(2) x0r = a(8) + a(10) x0i = a(9) + a(11) x1r = a(8) - a(10) x1i = a(9) - a(11) x2r = a(12) + a(14) x2i = a(13) + a(15) x3r = a(12) - a(14) x3i = a(13) - a(15) a(8) = x0r + x2r a(9) = x0i + x2i a(12) = x2i - x0i a(13) = x0r - x2r x0r = x1r - x3i x0i = x1i + x3r a(10) = wk1r * (x0r - x0i) a(11) = wk1r * (x0r + x0i) x0r = x3i + x1r x0i = x3r - x1i a(14) = wk1r * (x0i - x0r) a(15) = wk1r * (x0i + x0r) k1 = 0 do j = 16, n - 16, 16 k1 = k1 + 2 k2 = 2 * k1 wk2r = w(k1) wk2i = w(k1 + 1) wk1r = w(k2) wk1i = w(k2 + 1) wk3r = wk1r - 2 * wk2i * wk1i wk3i = 2 * wk2i * wk1r - wk1i x0r = a(j) + a(j + 2) x0i = a(j + 1) + a(j + 3) x1r = a(j) - a(j + 2) x1i = a(j + 1) - a(j + 3) x2r = a(j + 4) + a(j + 6) x2i = a(j + 5) + a(j + 7) x3r = a(j + 4) - a(j + 6) x3i = a(j + 5) - a(j + 7) a(j) = x0r + x2r a(j + 1) = x0i + x2i x0r = x0r - x2r x0i = x0i - x2i a(j + 4) = wk2r * x0r - wk2i * x0i a(j + 5) = wk2r * x0i + wk2i * x0r x0r = x1r - x3i x0i = x1i + x3r a(j + 2) = wk1r * x0r - wk1i * x0i a(j + 3) = wk1r * x0i + wk1i * x0r x0r = x1r + x3i x0i = x1i - x3r a(j + 6) = wk3r * x0r - wk3i * x0i a(j + 7) = wk3r * x0i + wk3i * x0r wk1r = w(k2 + 2) wk1i = w(k2 + 3) wk3r = wk1r - 2 * wk2r * wk1i wk3i = 2 * wk2r * wk1r - wk1i x0r = a(j + 8) + a(j + 10) x0i = a(j + 9) + a(j + 11) x1r = a(j + 8) - a(j + 10) x1i = a(j + 9) - a(j + 11) x2r = a(j + 12) + a(j + 14) x2i = a(j + 13) + a(j + 15) x3r = a(j + 12) - a(j + 14) x3i = a(j + 13) - a(j + 15) a(j + 8) = x0r + x2r a(j + 9) = x0i + x2i x0r = x0r - x2r x0i = x0i - x2i a(j + 12) = -wk2i * x0r - wk2r * x0i a(j + 13) = -wk2i * x0i + wk2r * x0r x0r = x1r - x3i x0i = x1i + x3r a(j + 10) = wk1r * x0r - wk1i * x0i a(j + 11) = wk1r * x0i + wk1i * x0r x0r = x1r + x3i x0i = x1i - x3r a(j + 14) = wk3r * x0r - wk3i * x0i a(j + 15) = wk3r * x0i + wk3i * x0r end do end! subroutine cftmdl(n, l, a, w) integer n, l, j, j1, j2, j3, k, k1, k2, m, m2 real*8 a(0 : n - 1), w(0 : *) real*8 wk1r, wk1i, wk2r, wk2i, wk3r, wk3i real*8 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i m = 4 * l do j = 0, l - 2, 2 j1 = j + l j2 = j1 + l j3 = j2 + l x0r = a(j) + a(j1) x0i = a(j + 1) + a(j1 + 1) x1r = a(j) - a(j1) x1i = a(j + 1) - a(j1 + 1) x2r = a(j2) + a(j3) x2i = a(j2 + 1) + a(j3 + 1) x3r = a(j2) - a(j3) x3i = a(j2 + 1) - a(j3 + 1) a(j) = x0r + x2r a(j + 1) = x0i + x2i a(j2) = x0r - x2r a(j2 + 1) = x0i - x2i a(j1) = x1r - x3i a(j1 + 1) = x1i + x3r a(j3) = x1r + x3i a(j3 + 1) = x1i - x3r end do wk1r = w(2) do j = m, l + m - 2, 2 j1 = j + l j2 = j1 + l j3 = j2 + l x0r = a(j) + a(j1) x0i = a(j + 1) + a(j1 + 1) x1r = a(j) - a(j1) x1i = a(j + 1) - a(j1 + 1) x2r = a(j2) + a(j3) x2i = a(j2 + 1) + a(j3 + 1) x3r = a(j2) - a(j3) x3i = a(j2 + 1) - a(j3 + 1) a(j) = x0r + x2r a(j + 1) = x0i + x2i a(j2) = x2i - x0i a(j2 + 1) = x0r - x2r x0r = x1r - x3i x0i = x1i + x3r a(j1) = wk1r * (x0r - x0i) a(j1 + 1) = wk1r * (x0r + x0i) x0r = x3i + x1r x0i = x3r - x1i a(j3) = wk1r * (x0i - x0r) a(j3 + 1) = wk1r * (x0i + x0r) end do k1 = 0 m2 = 2 * m do k = m2, n - m2, m2 k1 = k1 + 2 k2 = 2 * k1 wk2r = w(k1) wk2i = w(k1 + 1) wk1r = w(k2) wk1i = w(k2 + 1) wk3r = wk1r - 2 * wk2i * wk1i wk3i = 2 * wk2i * wk1r - wk1i do j = k, l + k - 2, 2 j1 = j + l j2 = j1 + l j3 = j2 + l x0r = a(j) + a(j1) x0i = a(j + 1) + a(j1 + 1) x1r = a(j) - a(j1) x1i = a(j + 1) - a(j1 + 1) x2r = a(j2) + a(j3) x2i = a(j2 + 1) + a(j3 + 1) x3r = a(j2) - a(j3) x3i = a(j2 + 1) - a(j3 + 1) a(j) = x0r + x2r a(j + 1) = x0i + x2i x0r = x0r - x2r x0i = x0i - x2i a(j2) = wk2r * x0r - wk2i * x0i a(j2 + 1) = wk2r * x0i + wk2i * x0r x0r = x1r - x3i x0i = x1i + x3r a(j1) = wk1r * x0r - wk1i * x0i a(j1 + 1) = wk1r * x0i + wk1i * x0r x0r = x1r + x3i x0i = x1i - x3r a(j3) = wk3r * x0r - wk3i * x0i a(j3 + 1) = wk3r * x0i + wk3i * x0r end do wk1r = w(k2 + 2) wk1i = w(k2 + 3) wk3r = wk1r - 2 * wk2r * wk1i wk3i = 2 * wk2r * wk1r - wk1i do j = k + m, l + (k + m) - 2, 2 j1 = j + l j2 = j1 + l j3 = j2 + l x0r = a(j) + a(j1) x0i = a(j + 1) + a(j1 + 1) x1r = a(j) - a(j1) x1i = a(j + 1) - a(j1 + 1) x2r = a(j2) + a(j3) x2i = a(j2 + 1) + a(j3 + 1) x3r = a(j2) - a(j3) x3i = a(j2 + 1) - a(j3 + 1) a(j) = x0r + x2r a(j + 1) = x0i + x2i x0r = x0r - x2r x0i = x0i - x2i a(j2) = -wk2i * x0r - wk2r * x0i a(j2 + 1) = -wk2i * x0i + wk2r * x0r x0r = x1r - x3i x0i = x1i + x3r a(j1) = wk1r * x0r - wk1i * x0i a(j1 + 1) = wk1r * x0i + wk1i * x0r x0r = x1r + x3i x0i = x1i - x3r a(j3) = wk3r * x0r - wk3i * x0i a(j3 + 1) = wk3r * x0i + wk3i * x0r end do end do 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 a(1) = -a(1) 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) = yi - a(j + 1) a(k) = a(k) + yr a(k + 1) = yi - a(k + 1) end do a(m + 1) = -a(m + 1) 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!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -