Python 中高斯和洛伦兹函数的 FFT
FFT of Gaussian and Lorentzian functions in Python
我需要计算高斯函数和洛伦兹函数的傅里叶变换并绘制结果。我知道两者的结果,但我似乎无法正确理解它们,而且我不太了解 fft 在 Python...
中的工作原理
这就是我到目前为止的洛伦兹函数
import numpy as np
from scipy import fftpack
import matplotlib.pyplot as plt
a = 1.0
N = 500 #number of points
x = np.linspace(-5,5,N)
lorentz = (a/np.pi) * (1/(a**2 + x**2)) #lorentzian function
fourier = fftpack.rfft(lorentz)
fourier = (2 * np.pi**2 / N)* abs(fourier[0:N/4]) #supposed to normalize
plt.plot(fourier)
plt.show()
我真的迷失了。我应该得到类似 exp(-pi|k|) 的东西,我不知道我应该用它做什么才能使它看起来更像我想要的。
fft() 函数没有给出您期望的结果的原因有很多:
- 首先,fft() 函数只计算离散傅里叶变换,它被定义为对有限数量的规则间隔点的求和,并且隐含地需要一个周期函数。连续时间傅里叶变换被定义为无限时间范围内的积分,而不假设信号是周期性的。
- 其次,您定义洛伦兹时间序列的方式有效地使其以远离原点的时间为中心。这将为所有傅立叶系数引入相位旋转(这可能就是为什么您在生成绘图之前采用绝对值的原因?)。
如果您采用足够多的样本点,并充分扩展输入波形的时间范围,我相信您确实应该收敛到 "correct" 答案,例如由 contour integration 获得。例如,如果您使用
x = numpy.linspace(-50, 50, 5000)
你得到一个看起来更像的离散傅里叶变换:
我需要计算高斯函数和洛伦兹函数的傅里叶变换并绘制结果。我知道两者的结果,但我似乎无法正确理解它们,而且我不太了解 fft 在 Python...
中的工作原理这就是我到目前为止的洛伦兹函数
import numpy as np
from scipy import fftpack
import matplotlib.pyplot as plt
a = 1.0
N = 500 #number of points
x = np.linspace(-5,5,N)
lorentz = (a/np.pi) * (1/(a**2 + x**2)) #lorentzian function
fourier = fftpack.rfft(lorentz)
fourier = (2 * np.pi**2 / N)* abs(fourier[0:N/4]) #supposed to normalize
plt.plot(fourier)
plt.show()
我真的迷失了。我应该得到类似 exp(-pi|k|) 的东西,我不知道我应该用它做什么才能使它看起来更像我想要的。
fft() 函数没有给出您期望的结果的原因有很多:
- 首先,fft() 函数只计算离散傅里叶变换,它被定义为对有限数量的规则间隔点的求和,并且隐含地需要一个周期函数。连续时间傅里叶变换被定义为无限时间范围内的积分,而不假设信号是周期性的。
- 其次,您定义洛伦兹时间序列的方式有效地使其以远离原点的时间为中心。这将为所有傅立叶系数引入相位旋转(这可能就是为什么您在生成绘图之前采用绝对值的原因?)。
如果您采用足够多的样本点,并充分扩展输入波形的时间范围,我相信您确实应该收敛到 "correct" 答案,例如由 contour integration 获得。例如,如果您使用
x = numpy.linspace(-50, 50, 5000)
你得到一个看起来更像的离散傅里叶变换: