网格数据库中的Numpy FFT失败了吗?

时间:2016-02-18 20:32:10

标签: python arrays numpy fft

使用具有FFT功能的Numpy网格物体,我遇到了一个奇怪的问题。具体来说,在使用meshgrids构建的数组上使用时,fft2或ifft2函数似乎都会失败。

x = np.arange(-4, 4, .08)
y = np.arange(-4, 4, .08)
X, Y = np.meshgrid(x, y)
field = (X + i*Y)*np.exp(X**2 + Y**2)

在我继续我的项目之前作为检查,我做了

fieldCheck1 = np.fft.fft2(field)
fieldCheck2 = np.fft.ifft2(fieldCheck1)

它应该会回复我的原始数组,但事实上消除了真实部分(abs(fieldCheck2)**2的图是零平面,最初它是高斯的)并且完全扰乱了相位信息({的相位图} {1}}看起来像静态而不是相位斜坡)

我已经检查了文档,但我没有看到任何可以解释这一点的内容。任何有关问题根源的见解都会有所帮助。

2 个答案:

答案 0 :(得分:2)

问题(在代码中用^替换**后)是您的最小值和最大值之间的对比度接近30个数量级:

>>> abs(field).max() / abs(field).min()
8.8904389513698014e+28

浮点运算仅具有有限精度,因此适用于实数数字的标识并不总是适用于浮点数字。举个简单的例子:

>>> x = 1
>>> y = 1e30
>>> z = x + y

>>> x == z - y
False

FFT本质上是一个更复杂的版本:你在非常大的数字中加入非常小的数字,当你再次减去非常大的数字时,你得到零而不是你想要的小数字。

答案 1 :(得分:0)

要添加@jakevdp描述的问题,看起来你是因为你的函数(在你的代码中用^替换**之后)进入整个混乱中

field = (X + 1.0j*Y)*np.exp(X**2 + Y**2)
你描述为高斯的

事实并非如此,如下图所示:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X,Y,np.abs(field));

enter image description here

要获得实际的2D高斯函数,请尝试:

x = np.arange(-4, 4, .08)
y = np.arange(-4, 4, .08)
X, Y = np.meshgrid(x, y)
field = np.exp(-(X**2 + Y**2))  # notice "-" sign in the exponent

然后会给你图表:

enter image description here

往返变换的相应错误np.abs(fieldCheck2-field)变为(更符合预期的数值精度):

enter image description here