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

📄 fft4f2d.f

📁 2维fft程序
💻 F
📖 第 1 页 / 共 4 页
字号:
                  jx = 2 * j                  t(jx, i) = a(j, i)                  t(jx + 1, i) = a(n1 - j, i)              end do          end do          t(0, 0) = a(0, 0)          t(1, 0) = a(n1h, 0)          t(0, n2h) = a(0, n2h)          t(1, n2h) = a(n1h, n2h)          do i = 1, n2h - 1              ic = n2 - i              t(0, i) = a(0, i)              t(1, ic) = a(n1h, i)              t(1, i) = a(0, ic)              t(0, ic) = a(n1h, ic)          end do          call dctfsub(n1max, n1, n2, t, nc, w(nw))          if (n2 .gt. 2) then              call bitrv2col(n1max, n1, n2, ip(2), t)          end if          call cftfcol(n1max, n1, n2, t, w)          do i = 0, n2 - 1              t(1, i) = 0.5d0 * (t(0, i) - t(1, i))              t(0, i) = t(0, i) - t(1, i)          end do          if (n1 .gt. 4) then              call rftfrow(n1max, n1, n2, t, nc, w(nw))              call bitrv2row(n1max, n1, n2, ip(2), t)          end if          call cftfrow(n1max, n1, n2, t, w)          do i = 0, n2h - 1              ix = 2 * i              ic = n2 - 1 - i              do j = 0, n1h - 1                  jx = 2 * j                  jc = n1 - 1 - j                  a(jx, ix) = t(j, i)                  a(jx + 1, ix) = t(jc, i)                  a(jx, ix + 1) = t(j, ic)                  a(jx + 1, ix + 1) = t(jc, ic)              end do          end do      else          do i = 0, n2h - 1              ix = 2 * i              ic = n2 - 1 - i              do j = 0, n1h - 1                  jx = 2 * j                  jc = n1 - 1 - j                  t(j, i) = a(jx, ix)                  t(jc, i) = a(jx + 1, ix)                  t(j, ic) = a(jx, ix + 1)                  t(jc, ic) = a(jx + 1, ix + 1)              end do          end do          if (n1 .gt. 4) then              call bitrv2row(n1max, n1, n2, ip(2), t)          end if          call cftbrow(n1max, n1, n2, t, w)          if (n1 .gt. 4) then              call rftbrow(n1max, n1, n2, t, nc, w(nw))          end if          do i = 0, n2 - 1              xi = t(0, i) - t(1, i)              t(0, i) = t(0, i) + t(1, i)              t(1, i) = xi          end do          if (n2 .gt. 2) then              call bitrv2col(n1max, n1, n2, ip(2), t)          end if          call cftbcol(n1max, n1, n2, t, w)          call dctbsub(n1max, n1, n2, t, nc, w(nw))          do i = 0, n2 - 1              do j = 1, n1h - 1                  jx = 2 * j                  a(j, i) = t(jx, i)                  a(n1 - j, i) = t(jx + 1, i)              end do          end do          a(0, 0) = t(0, 0)          a(n1h, 0) = t(1, 0)          a(0, n2h) = t(0, n2h)          a(n1h, n2h) = t(1, n2h)          do i = 1, n2h - 1              ic = n2 - i              a(0, i) = t(0, i)              a(n1h, i) = t(1, ic)              a(0, ic) = t(1, i)              a(n1h, ic) = t(0, ic)          end do      end if      end!      subroutine ddst2d(n1max, n1, n2, isgn, a, t, ip, w)      integer n1max, n1, n2, isgn, ip(0 : *), n, nw, nc, n1h, n2h,      &    i, ix, ic, j, jx, jc      real*8 a(0 : n1max - 1, 0 : n2 - 1),      &    t(0 : n1max - 1, 0 : n2 - 1), w(0 : *), xi      n = max(n1, 2 * n2)      nw = ip(0)      if (n .gt. 4 * nw) then          nw = n / 4          call makewt(nw, ip, w)      end if      nc = ip(1)      if (n1 .gt. nc .or. n2 .gt. nc) then          nc = max(n1, n2)          call makect(nc, ip, w(nw))      end if      n1h = n1 / 2      n2h = n2 / 2      if (isgn .ge. 0) then          do i = 0, n2 - 1              do j = 1, n1h - 1                  jx = 2 * j                  t(jx, i) = a(j, i)                  t(jx + 1, i) = a(n1 - j, i)              end do          end do          t(0, 0) = a(0, 0)          t(1, 0) = a(n1h, 0)          t(0, n2h) = a(0, n2h)          t(1, n2h) = a(n1h, n2h)          do i = 1, n2h - 1              ic = n2 - i              t(0, i) = a(0, i)              t(1, ic) = a(n1h, i)              t(1, i) = a(0, ic)              t(0, ic) = a(n1h, ic)          end do          call dstfsub(n1max, n1, n2, t, nc, w(nw))          if (n2 .gt. 2) then              call bitrv2col(n1max, n1, n2, ip(2), t)          end if          call cftfcol(n1max, n1, n2, t, w)          do i = 0, n2 - 1              t(1, i) = 0.5d0 * (t(0, i) - t(1, i))              t(0, i) = t(0, i) - t(1, i)          end do          if (n1 .gt. 4) then              call rftfrow(n1max, n1, n2, t, nc, w(nw))              call bitrv2row(n1max, n1, n2, ip(2), t)          end if          call cftfrow(n1max, n1, n2, t, w)          do i = 0, n2h - 1              ix = 2 * i              ic = n2 - 1 - i              do j = 0, n1h - 1                  jx = 2 * j                  jc = n1 - 1 - j                  a(jx, ix) = t(j, i)                  a(jx + 1, ix) = -t(jc, i)                  a(jx, ix + 1) = -t(j, ic)                  a(jx + 1, ix + 1) = t(jc, ic)              end do          end do      else          do i = 0, n2h - 1              ix = 2 * i              ic = n2 - 1 - i              do j = 0, n1h - 1                  jx = 2 * j                  jc = n1 - 1 - j                  t(j, i) = a(jx, ix)                  t(jc, i) = -a(jx + 1, ix)                  t(j, ic) = -a(jx, ix + 1)                  t(jc, ic) = a(jx + 1, ix + 1)              end do          end do          if (n1 .gt. 4) then              call bitrv2row(n1max, n1, n2, ip(2), t)          end if          call cftbrow(n1max, n1, n2, t, w)          if (n1 .gt. 4) then              call rftbrow(n1max, n1, n2, t, nc, w(nw))          end if          do i = 0, n2 - 1              xi = t(0, i) - t(1, i)              t(0, i) = t(0, i) + t(1, i)              t(1, i) = xi          end do          if (n2 .gt. 2) then              call bitrv2col(n1max, n1, n2, ip(2), t)          end if          call cftbcol(n1max, n1, n2, t, w)          call dstbsub(n1max, n1, n2, t, nc, w(nw))          do i = 0, n2 - 1              do j = 1, n1h - 1                  jx = 2 * j                  a(j, i) = t(jx, i)                  a(n1 - j, i) = t(jx + 1, i)              end do          end do          a(0, 0) = t(0, 0)          a(n1h, 0) = t(1, 0)          a(0, n2h) = t(0, n2h)          a(n1h, n2h) = t(1, n2h)          do i = 1, n2h - 1              ic = n2 - i              a(0, i) = t(0, i)              a(n1h, i) = t(1, ic)              a(0, ic) = t(1, i)              a(n1h, ic) = t(0, ic)          end do      end if      end!! -------- initializing routines --------!      subroutine makewt(nw, ip, w)      integer nw, ip(0 : *), nwh, j      real*8 w(0 : nw - 1), delta, x, y      ip(0) = nw      ip(1) = 1      if (nw .gt. 2) then          nwh = nw / 2          delta = atan(1.0d0) / nwh          w(0) = 1          w(1) = 0          w(nwh) = cos(delta * nwh)          w(nwh + 1) = w(nwh)          do j = 2, nwh - 2, 2              x = cos(delta * j)              y = sin(delta * j)              w(j) = x              w(j + 1) = y              w(nw - j) = y              w(nw - j + 1) = x          end do          call bitrv2(nw, ip(2), w)      end if      end!      subroutine makect(nc, ip, c)      integer nc, ip(0 : *), nch, j      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) = 0.5d0          c(nch) = 0.5d0 * cos(delta * nch)          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 bitrv2(n, ip, a)      integer n, ip(0 : *), j, j1, k, k1, l, m, m2      real*8 a(0 : n - 1), xr, xi      ip(0) = 0      l = n      m = 1      do while (4 * m .lt. l)          l = l / 2          do j = 0, m - 1              ip(m + j) = ip(j) + l          end do          m = m * 2      end do      if (4 * m .gt. l) then          do k = 1, m - 1              do j = 0, k - 1                  j1 = 2 * j + ip(k)                  k1 = 2 * k + ip(j)                  xr = a(j1)                  xi = a(j1 + 1)                  a(j1) = a(k1)                  a(j1 + 1) = a(k1 + 1)                  a(k1) = xr                  a(k1 + 1) = xi              end do          end do      else          m2 = 2 * m          do k = 1, m - 1              do j = 0, k - 1                  j1 = 2 * j + ip(k)                  k1 = 2 * k + ip(j)                  xr = a(j1)                  xi = a(j1 + 1)                  a(j1) = a(k1)                  a(j1 + 1) = a(k1 + 1)                  a(k1) = xr                  a(k1 + 1) = xi                  j1 = j1 + m2                  k1 = k1 + m2                  xr = a(j1)                  xi = a(j1 + 1)                  a(j1) = a(k1)                  a(j1 + 1) = a(k1 + 1)                  a(k1) = xr                  a(k1 + 1) = xi              end do          end do      end if      end!      subroutine bitrv2row(n1max, n, n2, ip, a)      integer n1max, n, n2, ip(0 : *), i, j, j1, k, k1, l, m, m2      real*8 a(0 : n1max - 1, 0 : n2 - 1), xr, xi      ip(0) = 0      l = n      m = 1      do while (4 * m .lt. l)          l = l / 2          do j = 0, m - 1              ip(m + j) = ip(j) + l          end do          m = m * 2      end do      if (4 * m .gt. l) then          do i = 0, n2 - 1              do k = 1, m - 1                  do j = 0, k - 1                      j1 = 2 * j + ip(k)                      k1 = 2 * k + ip(j)                      xr = a(j1, i)                      xi = a(j1 + 1, i)                      a(j1, i) = a(k1, i)                      a(j1 + 1, i) = a(k1 + 1, i)                      a(k1, i) = xr                      a(k1 + 1, i) = xi                  end do              end do          end do      else          m2 = 2 * m          do i = 0, n2 - 1              do k = 1, m - 1                  do j = 0, k - 1                      j1 = 2 * j + ip(k)                      k1 = 2 * k + ip(j)                      xr = a(j1, i)                      xi = a(j1 + 1, i)                      a(j1, i) = a(k1, i)                      a(j1 + 1, i) = a(k1 + 1, i)                      a(k1, i) = xr                      a(k1 + 1, i) = xi                      j1 = j1 + m2                      k1 = k1 + m2                      xr = a(j1, i)                      xi = a(j1 + 1, i)                      a(j1, i) = a(k1, i)                      a(j1 + 1, i) = a(k1 + 1, i)                      a(k1, i) = xr                      a(k1 + 1, i) = xi                  end do              end do          end do      end if      end!      subroutine bitrv2col(n1max, n1, n, ip, a)      integer n1max, n1, n, ip(0 : *), i, j, j1, k, k1, l, m      real*8 a(0 : n1max - 1, 0 : n - 1), xr, xi      ip(0) = 0      l = n      m = 1      do while (2 * m .lt. l)          l = l / 2          do j = 0, m - 1              ip(m + j) = ip(j) + l          end do          m = m * 2      end do      if (2 * m .gt. l) then          do k = 1, m - 1              do j = 0, k - 1                  j1 = j + ip(k)                  k1 = k + ip(j)                  do i = 0, n1 - 2, 2                      xr = a(i, j1)                      xi = a(i + 1, j1)                      a(i, j1) = a(i, k1)                      a(i + 1, j1) = a(i + 1, k1)                      a(i, k1) = xr                      a(i + 1, k1) = xi                  end do              end do          end do      else          do k = 1, m - 1              do j = 0, k - 1                  j1 = j + ip(k)                  k1 = k + ip(j)                  do i = 0, n1 - 2, 2                      xr = a(i, j1)                      xi = a(i + 1, j1)                      a(i, j1) = a(i, k1)                      a(i + 1, j1) = a(i + 1, k1)                      a(i, k1) = xr                      a(i + 1, k1) = xi                  end do

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -