Fortran Coder

查看: 767|回复: 0
打印 上一主题 下一主题

[通用算法] 二维傅里叶变换

[复制链接]

1

帖子

1

主题

0

精华

新人

F 币
13 元
贡献
3 点
跳转到指定楼层
楼主
发表于 2023-10-8 17:08:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
可以帮忙看一下这段代码哪里出问题了嘛,算出来的数据不太对
Module FFT2D_Mod
  Implicit None
  Integer, parameter :: DP = Selected_Real_Kind(15)
  Integer, parameter :: FFT_Forward = 1
  Integer, parameter :: FFT_Inverse = -1
contains
  Subroutine fc2DFFT(x, forback)
    ! 2D Fast Fourier Transform using Cooley-Tukey algorithm
    Real(Kind=DP), parameter :: PI = 3.141592654_DP
    Complex(Kind=DP), Intent(INOUT) :: x(:,:)
    Integer, Intent(IN) :: forback
    Integer :: nx, ny
    Integer :: i, j, k, ncur, ntmp, itmp
    Real(Kind=DP) :: ex, ey
    Complex(Kind=DP) :: ctmp
    nx = Size(x, 1)
    ny = Size(x, 2)
   
    ! Perform FFT along rows
    Do j = 1, ny
      ncur = nx
      Do
        ntmp = ncur
        ex = 2.0_DP * PI / ncur
        ncur = ncur / 2
        if (ncur < 1) exit
        Do i = 1, nx, ntmp
          Do k = 1, ntmp / 2
            itmp = i + k
            ctmp = x(itmp, j) * Exp(forback * CMPLX(0.0_DP, ex * (k - 1), Kind=DP))
            x(itmp, j) = x(i, j) - ctmp
            x(i, j) = x(i, j) + ctmp
          End Do
        End Do
      End Do
    End Do
   
    ! Perform FFT along columns
    Do i = 1, nx
      ncur = ny
      Do
        ntmp = ncur
        ey = 2.0_DP * PI / ncur
        ncur = ncur / 2
        if (ncur < 1) exit
        Do j = 1, ny, ntmp
          Do k = 1, ntmp / 2
            itmp = j + k
            ctmp = x(i, itmp) * Exp(forback * CMPLX(0.0_DP, ey * (k - 1), Kind=DP))
            x(i, itmp) = x(i, j) - ctmp
            x(i, j) = x(i, j) + ctmp
          End Do
        End Do
      End Do
    End Do
   
    ! If performing inverse FFT, divide by the total number of points
    if (forback == FFT_Inverse) then
      x = x / (nx * ny)
    end if
   
  End Subroutine fc2DFFT
End Module FFT2D_Mod
Program TwoDFFT
  use FFT2D_Mod
  Implicit None
  Integer :: i, j
  Integer, parameter :: Nx = 4
  Integer, parameter :: Ny = 4
  Complex(Kind=DP) :: x(Nx, Ny) = reshape([36.d0, 21.d0, 33.d0, 44.d0, 55.d0, 63.d0, 73.d0, 38.d0, &
                                            36.d0, 21.d0, 33.d0, 44.d0, 55.d0, 63.d0, 73.d0, 38.d0], [Nx, Ny])
  
  ! Perform 2D FFT
  Call fc2DFFT(x, FFT_Forward)
  
  ! Print the result
  Do j = 1, Ny
    Do i = 1, Nx
      Write(*, *) x(i, j)
    End Do
  End Do
  
  ! Perform inverse 2D FFT
  Call fc2DFFT(x, FFT_Inverse)
  
  ! Normalize and print the result
  Do j = 1, Ny
    Do i = 1, Nx
      Write(*, *) x(i, j)
    End Do
  End Do
  
End Program TwoDFFT

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-28 12:30

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表