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

📄 fft2f.f

📁 FFT代原碼為C++需要測過才能用
💻 F
📖 第 1 页 / 共 2 页
字号:
          wdr = wi * wi
          wdi = wi * wr
          ss = 4 * wdi
          wmr = 1 - 2 * wdr
          wmi = 2 * wdi
          if (wmi .ge. 0) then
              call cdft(n, wmr, wmi, a)
              xi = a(0) - a(1)
              a(0) = a(0) + a(1)
              a(1) = xi
          end if
          do k = n / 2 - 4, 4, -4
              j = n - k
              xr = a(k + 2) - a(j - 2)
              xi = a(k + 3) + a(j - 1)
              yr = wdr * xr - wdi * xi
              yi = wdr * xi + wdi * xr
              a(k + 2) = a(k + 2) - yr
              a(k + 3) = a(k + 3) - yi
              a(j - 2) = a(j - 2) + yr
              a(j - 1) = a(j - 1) - yi
              wkr = wkr + ss * wdi
              wki = wki + ss * (0.5d0 - wdr)
              xr = a(k) - a(j)
              xi = a(k + 1) + a(j + 1)
              yr = wkr * xr - wki * xi
              yi = wkr * xi + wki * xr
              a(k) = a(k) - yr
              a(k + 1) = a(k + 1) - yi
              a(j) = a(j) + yr
              a(j + 1) = a(j + 1) - yi
              wdr = wdr + ss * wki
              wdi = wdi + ss * (0.5d0 - wkr)
          end do
          j = n - 2
          xr = a(2) - a(j)
          xi = a(3) + a(j + 1)
          yr = wdr * xr - wdi * xi
          yi = wdr * xi + wdi * xr
          a(2) = a(2) - yr
          a(3) = a(3) - yi
          a(j) = a(j) + yr
          a(j + 1) = a(j + 1) - yi
          if (wmi .lt. 0) then
              a(1) = 0.5d0 * (a(0) - a(1))
              a(0) = a(0) - a(1)
              call cdft(n, wmr, wmi, a)
          end if
      else
          if (wi .lt. 0) then
              a(1) = 0.5d0 * (a(0) - a(1))
              a(0) = a(0) - a(1)
          end if
          if (n .gt. 2) then
              xr = a(0) - a(2)
              xi = a(1) - a(3)
              a(0) = a(0) + a(2)
              a(1) = a(1) + a(3)
              a(2) = xr
              a(3) = xi
          end if
          if (wi .ge. 0) then
              xi = a(0) - a(1)
              a(0) = a(0) + a(1)
              a(1) = xi
          end if
      end if
      end
!
      subroutine ddct(n, wr, wi, a)
      integer n, j, k, m
      real*8 wr, wi, a(0 : n - 1), wkr, wki, wdr, wdi, ss, xr
      if (n .gt. 2) then
          wkr = 0.5d0
          wki = 0.5d0
          wdr = 0.5d0 * (wr - wi)
          wdi = 0.5d0 * (wr + wi)
          ss = 2 * wi
          if (wi .lt. 0) then
              xr = a(n - 1)
              do k = n - 2, 2, -2
                  a(k + 1) = a(k) - a(k - 1)
                  a(k) = a(k) + a(k - 1)
              end do
              a(1) = 2 * xr
              a(0) = 2 * a(0)
              call rdft(n, 1 - ss * wi, ss * wr, a)
              xr = wdr
              wdr = wdi
              wdi = xr
              ss = -ss
          end if
          m = n / 2
          do k = 1, m - 3, 2
              j = n - k
              xr = wdi * a(k) - wdr * a(j)
              a(k) = wdr * a(k) + wdi * a(j)
              a(j) = xr
              wkr = wkr - ss * wdi
              wki = wki + ss * wdr
              xr = wki * a(k + 1) - wkr * a(j - 1)
              a(k + 1) = wkr * a(k + 1) + wki * a(j - 1)
              a(j - 1) = xr
              wdr = wdr - ss * wki
              wdi = wdi + ss * wkr
          end do
          k = m - 1
          j = n - k
          xr = wdi * a(k) - wdr * a(j)
          a(k) = wdr * a(k) + wdi * a(j)
          a(j) = xr
          a(m) = (wki + ss * wdr) * a(m)
          if (wi .ge. 0) then
              call rdft(n, 1 - ss * wi, ss * wr, a)
              xr = a(1)
              do k = 2, n - 2, 2
                  a(k - 1) = a(k) - a(k + 1)
                  a(k) = a(k) + a(k + 1)
              end do
              a(n - 1) = xr
          end if
      else
          if (wi .ge. 0) then
              xr = 0.5d0 * (wr + wi) * a(1)
              a(1) = a(0) - xr
              a(0) = a(0) + xr
          else
              xr = a(0) - a(1)
              a(0) = a(0) + a(1)
              a(1) = 0.5d0 * (wr - wi) * xr
          end if
      end if
      end
!
      subroutine ddst(n, wr, wi, a)
      integer n, j, k, m
      real*8 wr, wi, a(0 : n - 1), wkr, wki, wdr, wdi, ss, xr
      if (n .gt. 2) then
          wkr = 0.5d0
          wki = 0.5d0
          wdr = 0.5d0 * (wr - wi)
          wdi = 0.5d0 * (wr + wi)
          ss = 2 * wi
          if (wi .lt. 0) then
              xr = a(n - 1)
              do k = n - 2, 2, -2
                  a(k + 1) = a(k) + a(k - 1)
                  a(k) = a(k) - a(k - 1)
              end do
              a(1) = -2 * xr
              a(0) = 2 * a(0)
              call rdft(n, 1 - ss * wi, ss * wr, a)
              xr = wdr
              wdr = -wdi
              wdi = xr
              wkr = -wkr
          end if
          m = n / 2
          do k = 1, m - 3, 2
              j = n - k
              xr = wdi * a(j) - wdr * a(k)
              a(k) = wdr * a(j) + wdi * a(k)
              a(j) = xr
              wkr = wkr - ss * wdi
              wki = wki + ss * wdr
              xr = wki * a(j - 1) - wkr * a(k + 1)
              a(k + 1) = wkr * a(j - 1) + wki * a(k + 1)
              a(j - 1) = xr
              wdr = wdr - ss * wki
              wdi = wdi + ss * wkr
          end do
          k = m - 1
          j = n - k
          xr = wdi * a(j) - wdr * a(k)
          a(k) = wdr * a(j) + wdi * a(k)
          a(j) = xr
          a(m) = (wki + ss * wdr) * a(m)
          if (wi .ge. 0) then
              call rdft(n, 1 - ss * wi, ss * wr, a)
              xr = a(1)
              do k = 2, n - 2, 2
                  a(k - 1) = a(k + 1) - a(k)
                  a(k) = a(k) + a(k + 1)
              end do
              a(n - 1) = -xr
          end if
      else
          if (wi .ge. 0) then
              xr = 0.5d0 * (wr + wi) * a(1)
              a(1) = xr - a(0)
              a(0) = a(0) + xr
          else
              xr = a(0) + a(1)
              a(0) = a(0) - a(1)
              a(1) = 0.5d0 * (wr - wi) * xr
          end if
      end if
      end
!
      subroutine bitrv(n, a)
      integer n, j, k, l, m, m2, n1
      real*8 a(0 : n - 1), xr
      if (n .gt. 2) then
          m = n / 4
          m2 = 2 * m
          n1 = n - 1
          k = 0
          do j = 0, m2 - 2, 2
              if (j .lt. k) then
                  xr = a(j)
                  a(j) = a(k)
                  a(k) = xr
              else if (j .gt. k) then
                  xr = a(n1 - j)
                  a(n1 - j) = a(n1 - k)
                  a(n1 - k) = xr
              end if
              xr = a(j + 1)
              a(j + 1) = a(m2 + k)
              a(m2 + k) = xr
              l = m
              do while (k .ge. l)
                  k = k - l
                  l = l / 2
              end do
              k = k + l
          end do
      end if
      end
!
      subroutine dfct(n, wr, wi, a)
      integer n, j, k, m, mh
      real*8 wr, wi, a(0 : n), wmr, wmi, xr, xi, an
      wmr = wr
      wmi = wi
      m = n / 2
      do j = 0, m - 1
          k = n - j
          xr = a(j) + a(k)
          a(j) = a(j) - a(k)
          a(k) = xr
      end do
      an = a(n)
      do while (m .ge. 2)
          call ddct(m, wmr, wmi, a)
          xr = 1 - 2 * wmi * wmi
          wmi = 2 * wmi * wmr
          wmr = xr
          call bitrv(m, a)
          mh = m / 2
          xi = a(m)
          a(m) = a(0)
          a(0) = an - xi
          an = an + xi
          do j = 1, mh - 1
              k = m - j
              xr = a(m + k)
              xi = a(m + j)
              a(m + j) = a(j)
              a(m + k) = a(k)
              a(j) = xr - xi
              a(k) = xr + xi
          end do
          xr = a(mh)
          a(mh) = a(m + mh)
          a(m + mh) = xr
          m = mh
      end do
      xi = a(1)
      a(1) = a(0)
      a(0) = an + xi
      a(n) = an - xi
      call bitrv(n, a)
      end
!
      subroutine dfst(n, wr, wi, a)
      integer n, j, k, m, mh
      real*8 wr, wi, a(0 : n - 1), wmr, wmi, xr, xi
      wmr = wr
      wmi = wi
      m = n / 2
      do j = 1, m - 1
          k = n - j
          xr = a(j) - a(k)
          a(j) = a(j) + a(k)
          a(k) = xr
      end do
      a(0) = a(m)
      do while (m .ge. 2)
          call ddst(m, wmr, wmi, a)
          xr = 1 - 2 * wmi * wmi
          wmi = 2 * wmi * wmr
          wmr = xr
          call bitrv(m, a)
          mh = m / 2
          do j = 1, mh - 1
              k = m - j
              xr = a(m + k)
              xi = a(m + j)
              a(m + j) = a(j)
              a(m + k) = a(k)
              a(j) = xr + xi
              a(k) = xr - xi
          end do
          a(m) = a(0)
          a(0) = a(m + mh)
          a(m + mh) = a(mh)
          m = mh
      end do
      a(1) = a(0)
      a(0) = 0
      call bitrv(n, a)
      end
!

⌨️ 快捷键说明

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