FFT2 中心对称物体的非零虚部?
FFT2 Non-zero imaginary part for centro-symmetric object?
我目前正在测试来自 numpy
的 fft
包。我创建了一个人工中心对称图像并对其进行了 2D FFT,我取了虚部并指出这不等于零。我不明白为什么,你有什么想法吗?当我从 1D 径向轮廓到 2D 图像时,我可能会错过一些东西,我真的不知道...
新更新(新示例):
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
调用可以解决此问题。
我目前正在测试来自 numpy
的 fft
包。我创建了一个人工中心对称图像并对其进行了 2D FFT,我取了虚部并指出这不等于零。我不明白为什么,你有什么想法吗?当我从 1D 径向轮廓到 2D 图像时,我可能会错过一些东西,我真的不知道...
新更新(新示例):
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
调用可以解决此问题。