using FFTW, Images, FFTViews function pfft2(h, Nx, Ny, center = true) (Mx, My) = size(h) if center Nx += mod(Nx, 2) == 0 ? 1 : 0 Ny += mod(Ny, 2) == 0 ? 1 : 0 Lnx = (Nx-1) ÷ 2 Lny = (Ny-1) ÷ 2 hb = zeros(Nx, Ny) H = zeros(Complex{Float64}, Nx, Ny) # para centrar, Mx e My devem ser ímpares: corrigir caso não. Mx += mod(Mx, 2) == 0 ? 1 : 0 Lx = (Mx-1) ÷ 2 My += mod(My, 2) == 0 ? 1 : 0 Ly = (My-1) ÷ 2 hv = FFTView(hb) hv[-Lx:Lx, -Ly:Ly] = h Hv = FFTView(H) Hv[-Lnx:Lnx, -Lny:Lny] = fft(hb) ωx = (2π/Nx)*(-Lnx:Lnx) ωy = (2π/Ny)*(-Lny:Lny) else hb = zeros(Nx, Ny) hb[1:Mx, 1:My] .= h H = fft(hb) ωx = (2π/Nx)*(0:Nx-1) ωy = (2π/Ny)*(0:Ny-1) end return H,ωx,ωy end function ipfft2(h, Nx, Ny, center = true) (Mx, My) = size(h) if center Nx += mod(Nx, 2) == 0 ? 1 : 0 Ny += mod(Ny, 2) == 0 ? 1 : 0 Lnx = (Nx-1) ÷ 2 Lny = (Ny-1) ÷ 2 hb = zeros(Nx, Ny) H = zeros(Complex{Float64}, Nx, Ny) # para centrar, Mx e My devem ser ímpares: corrigir caso não. Mx += mod(Mx, 2) == 0 ? 1 : 0 Lx = (Mx-1) ÷ 2 My += mod(My, 2) == 0 ? 1 : 0 Ly = (My-1) ÷ 2 hv = FFTView(hb) hv[-Lx:Lx, -Ly:Ly] = h Hv = FFTView(H) Hv[-Lnx:Lnx, -Lny:Lny] = ifft(hb) else H = zeros(Complex, Nx, Ny) H[1:Mx, 1:My] .= h H = ifft(H) end return h end