Я пытаюсь реализовать функцию, которая вычисляет обратное преобразование Фурье непрерывной функции F(ω)
, чтобы получить f(x)
.
Моя входная функция непрерывна (можно предположить, что это лямбда-функция), поэтому мне приходится аппроксимировать ее дискретно, используя дискретную выборку. Вот моя текущая реализация:
import numpy as np
def fourier_inverse(f, n, omega_max):
"""
:param f: The function to be transformed
:param n: Number of samples
:param omega_max: The max frequency we want to be samples
"""
omega_range = np.linspace(-omega_max, omega_max, n)
f_values = f(omega_range, sigma, alpha)
inverse_f = np.fft.ifftshift(np.fft.ifft(np.fft.fftshift(f_values)))
return inverse_f
Однако у меня есть две основные проблемы:
Любая помощь или руководство будут очень признательны. Спасибо!
@CrisLuengo Я пытаюсь аппроксимировать это, используя дискретное преобразование Фурье. Моя инвертированная функция может не иметь символического представления.
Если ваша функция не ограничена полосой частот и не приближается к нулю в какой-то момент на обоих концах, вы не сможете выполнить ее выборку и получить из нее значимое ДПФ (или IDFT). — Ограничение по полосе означает, что преобразование также приближается к нулю в какой-то момент на обоих концах и, следовательно, также может быть выбрано.
@CrisLuengo Он приближается к нулю. Это форма функции Гаусса. Я хочу воспроизвести второй GIF на этом сайте: jacopobertolotti.com/FractionalDerivativesIntro.html
Да, это кажется выполнимым. Благодарю за разъяснение!
Вы можете рассчитать преобразование Фурье, используя:
np.fft.ifftshift(np.fft.ifft(np.fft.fftshift(f(omega_range))))
lambda x: np.exp(-x ** 2)
— функция Гаусса.np.fft.ifftshift(np.fft.fftfreq(n, d=delta_omega))
— пространственный диапазон.delta_omega * n / (2 * np.pi)
нормализует iFFt.import numpy as np
def fourier_inverse(f, n, omega_max):
omega_range = np.linspace(-omega_max, omega_max, n)
f_values = np.fft.ifftshift(np.fft.ifft(np.fft.fftshift(f(omega_range))))
delta_omega = 2 * omega_max / n
x_range = np.fft.ifftshift(np.fft.fftfreq(n, d=delta_omega))
f_values *= delta_omega * n / (2 * np.pi)
return x_range, f_values
x, f = fourier_inverse(lambda x: np.exp(-x ** 2), 512, 10)
print(x, f)
Спасибо. Но, похоже, x_range
неверно. Если я не ошибаюсь, так и должно быть x_max = np.pi / delta_omega \n x_range = np.linspace(-x_max, x_max, n)
Вы не можете вычислить преобразование Фурье с помощью NumPy. Вы вычисляете дискретное преобразование Фурье, которое отличается от преобразования Фурье. Вам нужна символьная математика, взгляните на SymPy.