⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fft4g.f

📁 This is a package to calculate Discrete Fourier/Cosine/Sine Transforms of 1-dimensional sequences of
💻 F
📖 第 1 页 / 共 3 页
字号:
              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 + -