FFT2 中心对称物体的非零虚部?

FFT2 Non-zero imaginary part for centro-symmetric object?

我目前正在测试来自 numpyfft 包。我创建了一个人工中心对称图像并对其进行了 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()

图片:

虚部:

您的代码有两个问题:

  1. 使用ifftshift将原点在中间的图像转换为原点在 FFT 期望的左上角。并使用 fftshift 将 FFT 的输出转换为原点在中间。 (你用错了方法。)但请注意,这两个函数对偶数大小的数组执行完全相同的操作,因此在修复此问题后你不会注意到差异。

  2. 您的输入必须以 size//2 为起点。您创建 new_r 的方式意味着原点恰好位于像素之间。我认为将 endpoint=False 添加到您的 np.linspace 调用可以解决此问题。