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

标签 python python-3.x numpy fft interpolation

我目前正在测试 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()

图片:

enter image description here

虚部:

enter image description here

最佳答案

您的代码有两个问题:

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

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

关于python - FFT2 中心对称物体的非零虚部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62838714/

相关文章:

python - 为每组连续增加的日期添加行号列

python - 查找所有使用 `print` 但不包含 `from __future__ import print_function` 的文件

python - 使用特定列绘制二维 NumPy 数组

python - 如何使用 CUDA CURAND 保存和恢复随机数生成器的状态?

python - 泡沫发送无属性

python - 如何在特定字段上使用进行排序

python 3 : error when dump/load sympy lambdify-epression

python - Numpy,将数组与标量相乘

python - 导入错误 : No module named _sqlite3 on GAE

python - pytest 获取当前测试文件的文件路径