根据我的好朋友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()
事实证明,y
的FFT的虚部为非零,并且实部在0附近剧烈振荡,这都是解析解决方案所无法预期的。谁能向我解释为什么会这样?
答案 0 :(得分:0)
要使FFT规范结果严格真实,输入必须在FFT输入数组中的第一个元素周围(圆形)对称。您的输入似乎在输入数组的中间对称,从而调制FFT结果(时移属性)。
尝试FFTShift操作。