【问题标题】:Fourier Transform in Python 2DPython 2D 中的傅里叶变换
【发布时间】:2018-10-23 03:57:27
【问题描述】:

我想使用fft2 以数字方式执行Fourier transformGaussian function。在这种转换下,函数被保留为一个常数。

我创建了 2 个网格:一个用于real space,第二个用于frequency(动量、k 等)。 (频率移至零)。我评估函数并最终绘制结果。

这是我的代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fft2, ifft2
from mpl_toolkits.mplot3d import Axes3D

"""CREATING REAL AND MOMENTUM SPACES GRIDS"""
N_x, N_y = 2 ** 11, 2 ** 11
range_x, range_y = np.arange(N_x), np.arange(N_y)
dx, dy = 0.005, 0.005
# real space grid vectors
xv, yv = dx * (range_x - 0.5 * N_x), dy * (range_y - 0.5 * N_y)
dk_x, dk_y = np.pi / np.max(xv), np.pi / np.max(yv)
# momentum space grid vectors, shifted to center for zero frequency
k_xv, k_yv = dk_x * np.append(range_x[:N_x//2], -range_x[N_x//2:0:-1]), \
            dk_y * np.append(range_y[:N_y//2], -range_y[N_y//2:0:-1])

# create real and momentum spaces grids
x, y = np.meshgrid(xv, yv, sparse=False, indexing='ij')
kx, ky = np.meshgrid(k_xv, k_yv, sparse=False, indexing='ij')

"""FUNCTION"""
f = np.exp(-0.5 * (x ** 2 + y ** 2))
F = fft2(f)
f2 = ifft2(F)
"""PLOTTING"""
fig = plt.figure()
ax = Axes3D(fig)
surf = ax.plot_surface(x, y, np.abs(f), cmap='viridis')
# for other plots I changed to
# surf = ax.plot_surface(kx, ky, np.abs(F), cmap='viridis')
# surf = ax.plot_surface(x, y, np.abs(f2), cmap='viridis')
plt.show()

所以,gaussian, fourier(gaussian), inverse_fourier(fourier(gaussian)) 的图如下:InitialFourierInverse Fourier

使用plt.imshow(),我另外绘制高斯傅里叶:

   plt.imshow(F)
   plt.colorbar()
   plt.show()

结果如下:imshow

这没有意义。我希望看到与初始相同的 gaussian function 直到某种恒定的统一顺序。

如果有人能为我澄清这一点,我将非常高兴。

【问题讨论】:

  • @Merlin1896 似乎乘法(在此链接中讨论)没有任何改变。所以,我认为这不是重点
  • 嗯,将F 乘以dy*dx/2/np.pi 确实会改变一些东西:现在F 的所有值都介于零和一之间。

标签: python numpy scipy fft


【解决方案1】:

我认为您对输出 F 的形状有点困惑。特别是,您可能想知道为什么会看到如此尖锐的峰值而不是广泛分布的高斯。

我稍微修改了你的代码:

 import numpy as np
 import matplotlib.pyplot as plt
 from scipy.fftpack import fft2, ifft2
 from mpl_toolkits.mplot3d import Axes3D

 """CREATING REAL AND MOMENTUM SPACES GRIDS"""
 N_x, N_y = 2 ** 10, 2 ** 10
 range_x, range_y = np.arange(N_x), np.arange(N_y)
 dx, dy = 0.005, 0.005
 # real space grid vectors
 xv, yv = dx * (range_x - 0.5 * N_x), dy * (range_y - 0.5 * N_y)
 dk_x, dk_y = np.pi / np.max(xv), np.pi / np.max(yv)
 # momentum space grid vectors, shifted to center for zero frequency
 k_xv, k_yv = dk_x * np.append(range_x[:N_x//2], -range_x[N_x//2:0:-1]), \
             dk_y * np.append(range_y[:N_y//2], -range_y[N_y//2:0:-1])

 # create real and momentum spaces grids
 x, y = np.meshgrid(xv, yv, sparse=False, indexing='ij')
 kx, ky = np.meshgrid(k_xv, k_yv, sparse=False, indexing='ij')

 """FUNCTION"""
 sigma=0.05
 f = 1/(2*np.pi*sigma**2) * np.exp(-0.5 * (x ** 2 + y ** 2)/sigma**2)
 F = fft2(f)
 """PLOTTING"""
 fig = plt.figure()
 ax = Axes3D(fig)
 surf = ax.plot_surface(x, y, np.abs(f), cmap='viridis')
 # for other plots I changed to
 fig2 = plt.figure()
 ax2 =Axes3D(fig2)
 surf = ax2.plot_surface(kx, ky, np.abs(F)*dx*dy, cmap='viridis')
 plt.show()

请注意,我引入了一个sigma 参数来控制高斯的宽度。我现在邀请您使用以下参数:N_xN_yd_xd_ysigma

然后您应该看到高斯在实空间和傅立叶空间中的逆行为:实空间中的高斯越大,傅立叶空间越窄,反之亦然。

因此,使用我的代码中当前设置的参数,您会得到以下图表:

真实空间:

傅立叶空间:

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-05-18
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 2020-03-29
  • 1970-01-01
相关资源
最近更新 更多