首页 > 解决方案 > python中复高斯的数值傅里叶变换

问题描述

我正在尝试使用numpy.fft.fft. 作为测试函数,我使用了一个相当简单的函数:具有复杂宽度参数的高斯函数

在此处输入图像描述.

该函数的傅里叶变换可以很容易地解析计算并给出

在此处输入图像描述.

我的问题是我无法使用数字重现解析傅里叶变换的结果numpy.fft.fft。这是我的代码

import numpy as np

import matplotlib.pyplot as plt
import matplotlib

from scipy.fftpack import fft, ifft, fftshift, fftfreq, fft2, ifft2

def fun(t, alpha, beta):
    # a function of time and 2 parameters
    norm = np.sqrt(alpha/np.pi)
    return norm * np.exp( -t**2 * (alpha + 1j*beta) )

def ft_fun_analytic(om, alpha, beta):
    # the analytical Fourier transform of fun(t)
    gamma = 1. / (1. + 1j*beta/alpha)
    norm = np.sqrt( gamma )
    return norm * np.exp( -om**2 * gamma / (4.*alpha) )

t  = np.linspace(-4., 4., 300000, endpoint=True)
om = 2.*np.pi * fftshift(fftfreq(len(t), d = t[1]-t[0]))
alpha, beta = [160., 0.07]

t_series  = fun(t, alpha, beta)
grid_norm = (t[1]-t[0])
om_spec   = grid_norm * fftshift(fft(t_series))

om_spec_analytic = ft_fun_analytic(om, alpha, beta)

fig1 = plt.figure(figsize=(10,5))
plt.subplot(121, xlabel=r'$t$', ylabel='Intensity', title=r'$f(t)$')
plt.plot(t, np.abs(t_series)**2)
plt.xlim([-0.4,0.4])

plt.subplot(122, xlabel=r'$t$', ylabel='Phase', title=r'$f(t)$')
plt.plot(t, np.angle(t_series))
plt.xlim([-0.4,0.4])
plt.show()

fig2 = plt.figure(figsize=(10,5))
plt.subplot(121, xlabel=r'$\omega$', ylabel='Intensity', title=r'$FT[f](\omega)$')
plt.plot(om, np.abs(om_spec)**2, label='numerical FT')
plt.plot(om, np.abs(om_spec_analytic)**2, '--', label='analytical FT')
plt.xlim([-120., 120.])
plt.legend()

plt.subplot(122, xlabel=r'$\omega$', ylabel='Phase', title=r'$FT[f](\omega)$')
plt.plot(om, np.angle(om_spec), label='numerical FT')
plt.plot(om, np.angle(om_spec_analytic), '--', label='analytical FT')
plt.xlim([-120., 120.])
plt.legend()
plt.show()

时域中的函数如下所示: 在此处输入图像描述

在频域中,数值傅里叶变换给出了正确的强度。但相位包括偏移和高频振荡: 在此处输入图像描述

我知道快速傅里叶变换的混叠和采样范围问题等影响。我尝试同时使用分辨率和范围。即使对于我的机器只能处理此问题的极精细采样也会发生。

有没有办法使用 重现分析结果numpy.fft.fft也许通过选择智能电网而不是非常好的电网?

我不是 100% 确定这个问题是属于科学计算网站还是这里。由于我(可能没有根据)的怀疑是这与指数函数评估中的数值精度有关,因此我将首先在这里尝试。

标签: pythonnumpyfft

解决方案


推荐阅读