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

📄 fft4g.f

📁 This is a package to calculate Discrete Fourier/Cosine/Sine Transforms of 1-dimensional sequences of
💻 F
📖 第 1 页 / 共 3 页
字号:
              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 bitrv2(m, ip(2), a)              call cftfsub(m, a, w)              call rftfsub(m, a, nc, w(nw))          else if (m .eq. 4) then              call cftfsub(m, a, 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 bitrv2(m, ip(2), t)                  call cftfsub(m, t, w)                  call rftfsub(m, t, nc, w(nw))              else if (m .eq. 4) then                  call cftfsub(m, t, 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 bitrv2(m, ip(2), a)              call cftfsub(m, a, w)              call rftfsub(m, a, nc, w(nw))          else if (m .eq. 4) then              call cftfsub(m, a, 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 bitrv2(m, ip(2), t)                  call cftfsub(m, t, w)                  call rftfsub(m, t, nc, w(nw))              else if (m .eq. 4) then                  call cftfsub(m, t, 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      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)          if (nwh .gt. 2) then              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 if      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 bitrv2(n, ip, a)      integer n, ip(0 : *), j, j1, k, k1, l, m, m2      real*8 a(0 : n - 1), xr, xi, yr, yi      ip(0) = 0      l = n      m = 1      do while (8 * m .lt. l)          l = l / 2          do j = 0, m - 1              ip(m + j) = ip(j) + l          end do          m = m * 2      end do      m2 = 2 * m      if (8 * m .eq. l) then          do k = 0, m - 1              do j = 0, k - 1                  j1 = 2 * j + ip(k)                  k1 = 2 * k + ip(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 + m2                  k1 = k1 + 2 * m2                  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 + m2                  k1 = k1 - m2                  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 + m2                  k1 = k1 + 2 * m2                  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              j1 = 2 * k + m2 + ip(k)              k1 = j1 + m2              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 = 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)                  yr = a(k1)                  yi = a(k1 + 1)                  a(j1) = yr                  a(j1 + 1) = yi                  a(k1) = xr                  a(k1 + 1) = xi                  j1 = j1 + m2                  k1 = k1 + m2                  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 do      end if      end!      subroutine bitrv2conj(n, ip, a)      integer n, ip(0 : *), j, j1, k, k1, l, m, m2      real*8 a(0 : n - 1), xr, xi, yr, yi      ip(0) = 0      l = n      m = 1      do while (8 * m .lt. l)          l = l / 2          do j = 0, m - 1              ip(m + j) = ip(j) + l          end do          m = m * 2      end do      m2 = 2 * m      if (8 * m .eq. l) then          do k = 0, m - 1              do j = 0, k - 1                  j1 = 2 * j + ip(k)                  k1 = 2 * k + ip(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 + m2                  k1 = k1 + 2 * m2                  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 + m2                  k1 = k1 - m2                  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 + m2                  k1 = k1 + 2 * m2                  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 = 2 * k + ip(k)              a(k1 + 1) = -a(k1 + 1)              j1 = k1 + m2              k1 = j1 + m2              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              k1 = k1 + m2              a(k1 + 1) = -a(k1 + 1)          end do      else          a(1) = -a(1)          a(m2 + 1) = -a(m2 + 1)          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)                  yr = a(k1)                  yi = -a(k1 + 1)                  a(j1) = yr                  a(j1 + 1) = yi                  a(k1) = xr                  a(k1 + 1) = xi                  j1 = j1 + m2                  k1 = k1 + m2                  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 = 2 * k + ip(k)

⌨️ 快捷键说明

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