高斯的Numpy FFT不给出高斯

时间:2019-06-26 15:09:34

标签: numpy fft

根据我的好朋友Wolfram,在时域/空间域中对高斯进行傅立叶变换,在频域/频谱域中又得到了一个高斯。当我使用numpy.fft.fft例程对它进行测试时,我并没有完全得到预期的结果。

import numpy as np
import matplotlib.pyplot as plt

N = 1000    # Number of samples
a = 10.0    # Inverse variance
x = np.linspace(-5, 5, N)   # Spatial domain
y = np.exp(-a*x**2)         # Gaussian in spatial domain

dx = x[1] - x[0]            # Sampling rate
k = np.fft.fftfreq(N, dx)   # Wave numbers
inds = np.argsort(k)        # Sorting order of wave numbers

# Analytical solution for Fourier transform of y
y_hat = np.sqrt(np.pi / a) * np.exp(-np.pi**2 * k**2 / a)
# Numerical solution (FFT of y)
y_hat2 = np.fft.fft(y)

# Plot original function in spatial domain
plt.subplot(211)
plt.plot(x, y)
plt.xlabel("position [m]")
plt.ylabel("y")

# Plot solutions in the spectral domain
plt.subplot(212)
plt.plot(k[inds], np.real(y_hat2[inds]), label="Real FFT(y)")
plt.plot(k[inds], np.imag(y_hat2[inds]), label="Imag FFT(y)")
plt.plot(k[inds], y_hat[inds], "k--", label="Analytical")
plt.xlabel("wave number [1/m]")
plt.ylabel("FFT(y)")
plt.ylim((-1, 1))
plt.xlim((-5, 5))
plt.legend()
plt.tight_layout()
plt.show()

结果: enter image description here

事实证明,y的FFT的虚部为非零,并且实部在0附近剧烈振荡,这都是解析解决方案所无法预期的。谁能向我解释为什么会这样?

1 个答案:

答案 0 :(得分:0)

要使FFT规范结果严格真实,输入必须在FFT输入数组中的第一个元素周围(圆形)对称。您的输入似乎在输入数组的中间对称,从而调制FFT结果(时移属性)。

尝试FFTShift操作。