【发布时间】:2018-10-23 03:57:27
【问题描述】:
我想使用fft2 以数字方式执行Fourier transform 的Gaussian 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)) 的图如下:Initial、Fourier、Inverse Fourier
使用plt.imshow(),我另外绘制高斯傅里叶:
plt.imshow(F)
plt.colorbar()
plt.show()
结果如下:imshow
这没有意义。我希望看到与初始相同的 gaussian function 直到某种恒定的统一顺序。
如果有人能为我澄清这一点,我将非常高兴。
【问题讨论】:
-
@Merlin1896 似乎乘法(在此链接中讨论)没有任何改变。所以,我认为这不是重点
-
嗯,将
F乘以dy*dx/2/np.pi确实会改变一些东西:现在F的所有值都介于零和一之间。