【问题标题】:Fourier transform of a Gaussian function in PythonPython中高斯函数的傅里叶变换
【发布时间】:2019-05-15 17:43:39
【问题描述】:

我想计算一些高斯函数的傅里叶变换。考虑简单的高斯 g(t) = e^{-t^2}。 g(t) 的傅里叶变换有一个simple analytical expression ,因此第 0 个频率就是根 pi。

如果我尝试在 Python 中做同样的事情:

N = 1000
t = np.linspace(-1,1,N)
g = np.exp(-t**2)

h = np.fft.fft(g) #This is the Fourier transform of expression g

足够简单。现在as per the docsh[0] 应该包含零频率项,我们从解析表达式中知道它是根 pi。但它却给了746.444?!

为什么解析解和计算解之间存在差异?

【问题讨论】:

    标签: python fft continuous-fourier


    【解决方案1】:

    不知道为什么你认为你应该得到分析表达式。 NUMPy 中的 DFFT 显然是不对称的,如果您查看 Akhere 的公式,您可以清楚地看到对于 A0,您应该得到输入的总和。此外,从 [-sigma...sigma] 区间获得高斯是不正确的。

    这里是修改示例

    import numpy as np
    import matplotlib.pyplot as plt
    
    N = 4001
    t = np.linspace(-4.0, 4.0, N)
    print((t[0], t[2000], t[4000]))
    g = np.exp(-t*t)
    print(np.sum(g)) # sum of input
    
    h = np.fft.fft(g, norm=None)
    print(h[0]) # should be the same as sum of input
    

    它会打印出来

    (-4.0, 0.0, 4.0)
    886.2269119018041
    (886.226911901804+0j)
    

    你可以做逆变换并绘制它

    q = np.fft.ifft(h, norm=None)
    
    plt.plot(t, g, label = "Gauss")
    plt.show()
    plt.plot(t, np.abs(q), label = "dFFT Gauss")
    plt.show()
    f = np.fft.fftfreq(N)
    plt.plot(f, np.angle(h), f, np.abs(h))
    plt.show()
    

    得到

    【讨论】:

    • 嗯,好的,这是 v.helpful - 但我仍然感到困惑:链接有效地表明 h(0) = root pi。我认为您已经稍微解释了“NUMPy 中的 DFFT 显然是不对称的”,但我仍然不完全清楚为什么 h(0) 不等于根 pi
    • @user1887919 嗯,这是 NumPy 中使用的约定。有些库有多个用于前后缩放的选项(例如 C 中的 likefftw3 和 C# 中的 mathdotnet),但据我所知,在 NumPy 中只有两个选项 - 无正向和 1/N 反向缩放(norm=None ,您和我都使用过)或 1/sqrt(N) 缩放用于正向和逆变换(“正交”选项)。这些选项都不会产生 sqrt(pi)。您可能可以将 NumPy FFT 包装到您自己的例程中,这些例程可以进行适当的缩放。
    • @user1887919 你可以看看mathworks.com/matlabcentral/answers/…,是Matlab,不过关于缩放的讨论还不错
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 2019-07-25
    • 2019-04-25
    相关资源
    最近更新 更多