【问题标题】:Fast Fourier Transform performance in PythonPython 中的快速傅里叶变换性能
【发布时间】:2021-01-11 00:25:34
【问题描述】:

所以我写了一个简短的 Python 程序来估计 Python 的 FFT 方法的准确性。

import numpy as np
import matplotlib.pyplot as plt

#Aufgabe 1
x0=0
a=2.5
k0=3
X=np.linspace(-4,4,100)
timestep=0.1
k=np.fft.fftfreq(X.size,d=timestep)
psi_analytical=[(2/(np.pi*a**2))**(1/4)*np.exp(-((i-x0)**2)/a**2)*np.exp(1j*k0*(i-x0)) for i in X]
psi_tilde_numerical=np.fft.fft(psi_analytical)
psi_tilde_analytical=[(2/(np.pi*a**2))**(1/4)*(a/2)*np.exp(-(a*(i-k0))**2/4)*np.exp(-1j*i*x0) for i in k]
psi_numerical=np.fft.ifft(psi_tilde_analytical)


#plt.plot(k,np.abs(psi_tilde_numerical),label='numerical psi tilde')
#plt.plot(k,np.abs(psi_tilde_analytical),'--',color='tab:orange', label='analytical psi tilde')

plt.plot(X,np.abs(psi_analytical),label='analytical psi, real')
plt.plot(X,np.abs(psi_numerical),'--',color='tab:orange',label='numerical psi, real')
plt.legend()
plt.show()

解析函数如下:

令我惊讶的是,数值函数和分析函数完全不同。但是,我不确定为什么会这样。

归一化常数N(2/(np.pi*a**2))**(1/4)

【问题讨论】:

  • 看起来分析函数是连续的,而 FFT 本质上是离散的。还有只看无限函数的窗口的问题。您实际上是将函数与一个框相乘,从而导致频域中的卷积。
  • 如果您绘制采样输入函数和 FFT 结果,并将它们添加到问题中,我们将更容易指出可能存在的问题。这些答案可能会帮助您找到问题:stackoverflow.com/a/49331862/7328782stackoverflow.com/a/49142862/7328782。尤其是第一个,因为我看到你的时间轴中间是 0,但你的代码中没有使用 ifftshift

标签: python numpy fft


【解决方案1】:

做更多的研究,我想我可能会为你找到答案。

离散傅里叶变换 (DFT) 使用快速傅里叶变换算法 (FFT) 高效计算,对离散时域信号进行运算。傅里叶变换 (FT) 在连续时域中对函数进行运算。

DFT 在特定条件下会逼近FT。这些条件之一是信号必须是频带限制。这意味着函数的FT 对于高于某个频率阈值α 的所有频率必须为零,并且DFT 的采样率必须至少为2*α 这可以追溯到Nyquist-Shannon sampling theorem

在您的情况下,您正在尝试逼近一个不受频带限制的高斯函数exp(-x²)。这是因为从公式中可以看出,高斯的FT 也是高斯的。这意味着它对于一直到无穷大的频率具有可忽略不计但非零的分量。因此,您将无法使用DFT 来近似FT,因为您需要有无限的采样率。

总之,重要的是要意识到DFTFT 是截然不同的转换,因此不能仅仅进行比较。

【讨论】:

    猜你喜欢
    • 2020-03-29
    • 2011-07-12
    • 2012-12-10
    • 2013-03-31
    • 2014-11-02
    • 2017-09-14
    • 2015-08-19
    • 1970-01-01
    相关资源
    最近更新 更多