Масштабирование по оси X обратного преобразования Фурье

Я реализую дискретное обратное преобразование Фурье в Python для аппроксимации обратного преобразования Фурье функции Гаусса.

Входная функция — sqrt(pi) * e^(-w^2/4), поэтому выходная функция должна быть e^(-x^2).

Хотя форма результирующей функции выглядит правильно, масштабирование по оси X, похоже, отключено (возможно, возникла проблема с нормализацией). Я ожидаю увидеть функцию Гаусса вида e^(-x^2), но мой результат намного уже.

Это моя реализация:

import matplotlib.pyplot as plt
import numpy as np
from sympy import symbols, exp, pi, lambdify, sqrt

# Defining the Fourier transform of a Gaussian function, sqrt(pi) * exp(-omega ** 2 / 4)
x, omega = symbols('x omega')
f_gaussian_symbolic = exp(-omega ** 2 / 4) * sqrt(pi)
f_gaussian_function = lambdify(omega, f_gaussian_symbolic, 'numpy')

def fourier_inverse(f, n, omega_max):
    """
    This function computes the inverse Fourier transform of a function f.
    :param f: The function to be transformed
    :param n: Number of samples
    :param omega_max: The max frequency we want to be sampled
    """
    omega_range = np.linspace(-omega_max, omega_max, n)
    f_values = f(omega_range)
    inverse_f = np.fft.ifftshift(np.fft.ifft(np.fft.fftshift(f_values)))
    delta_omega = omega_range[1] - omega_range[0]
    x_range = np.fft.ifftshift(np.fft.fftfreq(n, d=delta_omega))
    inverse_f *= delta_omega * n / (2 * np.pi)
    return x_range, inverse_f

plt.figure(figsize=(10, 5))
x_range, inverse_f = fourier_inverse(f_gaussian_function, 10000, 100)
plt.plot(x_range, inverse_f.real)
plt.ylim(-2, 2)
plt.xlim(-4, 4)
plt.show()

Я ожидаю, что сюжет будет таким:

Купите мой результат:

Форма функции выглядит правильно, но она намного уже, чем ожидалось. Я подозреваю, что возникла проблема с тем, как я вычисляю или масштабирую x_range в своей fourier_inverse функции.

Что я делаю не так в своей реализации и как я могу исправить масштабирование по оси X, чтобы получить ожидаемую функцию Гаусса e^(-x^2)?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы используете частоту по оси X, когда ожидаете угловую частоту. Вам следует изменить свои вычисления x_range следующим образом:

    x_range = 2 * np.pi * np.fft.ifftshift(np.fft.fftfreq(n, d=delta_omega))

После этого изменения результирующий график будет выглядеть следующим образом:

Другие вопросы по теме