Numpy FFT Gaussian не дает гауссов - PullRequest
0 голосов
/ 26 июня 2019

По словам моего хорошего друга Вольфрама , преобразование Фурье гауссиана во временной / пространственной области дает другой гауссиан в частотной / спектральной области.Когда я проверяю это с помощью процедуры 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 отлична от нуля, а действительная часть сильно колеблется около 0, обе из которых не ожидаются от аналитического решения.Может ли кто-нибудь объяснить мне, почему это происходит?

1 Ответ

0 голосов
/ 26 июня 2019

Чтобы канонический результат БПФ был строго реальным, входные данные должны быть (циркулярно) симметричными относительно первого элемента во входном массиве БПФ. Ваш ввод кажется симметричным относительно середины входного массива, который модулирует результат FFT (свойство сдвига времени).

Попробуйте операцию FFTShift.

...