我目前正在测试 numpy
中的 fft
包。我创建了一个人工中心对称图像,并对它进行了 2D FFT,我取了虚部并指出它不等于零。我不明白为什么,你有什么想法吗?也许当我从一维径向轮廓转到二维图像时我错过了一些东西,我真的不知道......
新更新(新示例):
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
I_min = 1.774E-6 #min(y_intensity[y_intensity!=0])
y = np.ones(50) #y_intensity[:50]
xv_3 = np.linspace(0,0.005,len(y))*1E3# x_intensity[:50]*1E3
new_r = np.linspace(-100,100,2**8)
interpol_index = interpolate.interp1d(xv_3, y)
X, Y = np.meshgrid(new_r,new_r)
profilegrid3 = np.ones(X.shape, float)
for i, x in enumerate(X[0, :]):
for k, z in enumerate(Y[:, 0]):
current_radius = np.sqrt(x**2 + z**2)
cond=np.logical_or(current_radius>=max(xv_3),current_radius<=min(xv_3))
if cond == True :
profilegrid3[i, k] = I_min
else :
profilegrid3[i, k] = interpol_index(current_radius)
plt.figure()
plt.imshow(np.imag(np.fft.ifftshift(np.fft.fft2(np.fft.fftshift(profilegrid3)))))
plt.colorbar()
plt.show()
图片:
虚部:
最佳答案
您的代码有两个问题:
使用
ifftshift
将原点位于中间的图像转换为原点位于 FFT 期望的左上角。并使用fftshift
将FFT的输出转换为原点在中间。 (您使用这些方法的方式是错误的。)但请注意,这两个函数对于偶数大小的数组执行完全相同的操作,因此修复此问题后您不会注意到差异。您的输入的原点必须为
size//2
。创建new_r
的方式意味着原点恰好位于像素之间。我认为将endpoint=False
添加到您的np.linspace
调用中可以解决此问题。
关于python - FFT2 中心对称物体的非零虚部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62838714/