【问题标题】:Discretized continuous Fourier transform with numpy用numpy离散化连续傅里叶变换
【发布时间】:2014-06-06 08:59:05
【问题描述】:

考虑一个函数 f(t),我如何计算连续傅立叶变换 g(w) 并绘制它(使用 numpy 和 matplotlib)?

如果傅里叶积分不存在解析解,则会出现此问题或逆问题(g(w) 给定,f(t) 的图未知)。

【问题讨论】:

  • +1 所以你写一个问题然后自己回答?
  • 是的,我读到鼓励人们这样做。这是我使用谷歌找不到解决方案的少数 numpy/matplotlib 问题之一。所以我想我会分享解决方案。我读到的关于回答你自己的问题的页面在这里blog.stackoverflow.com/2011/07/…
  • 嗨,你能看一下我的问题here吗?

标签: math numpy matplotlib fft continuous-fourier


【解决方案1】:

您可以为此使用numpy FFT module,但必须做一些额外的工作。首先让我们看一下傅里叶积分并将其离散化: 这里 k,m 是整数,N 是 f(t) 的数据点数。使用这种离散化,我们得到

最后一个表达式中的总和正是 numpy 使用的离散傅里叶变换 (DFT)(请参阅numpy FFT module 的“实现细节”部分)。 有了这些知识,我们就可以编写下面的python脚本了

import numpy as np
import matplotlib.pyplot as pl

#Consider function f(t)=1/(t^2+1)
#We want to compute the Fourier transform g(w)

#Discretize time t
t0=-100.
dt=0.001
t=np.arange(t0,-t0,dt)
#Define function
f=1./(t**2+1.)

#Compute Fourier transform by numpy's FFT function
g=np.fft.fft(f)
#frequency normalization factor is 2*np.pi/dt
w = np.fft.fftfreq(f.size)*2*np.pi/dt


#In order to get a discretisation of the continuous Fourier transform
#we need to multiply g by a phase factor
g*=dt*np.exp(-complex(0,1)*w*t0)/(np.sqrt(2*np.pi))

#Plot Result
pl.scatter(w,g,color="r")
#For comparison we plot the analytical solution
pl.plot(w,np.exp(-np.abs(w))*np.sqrt(np.pi/2),color="g")

pl.gca().set_xlim(-10,10)
pl.show()
pl.close()

结果图显示脚本有效

【讨论】:

  • +1 发布问题并自己回答的好方法!
  • 如果您以这种方式计算(离散化)FT,您能否包含小于 1 的频率或输入数组长度的倍数的周期?也许您可以帮助回答这个问题:dsp.stackexchange.com/questions/39017/…
  • 是的,对于频率到时间的傅立叶变换,您应该包含较小的频率,否则长时间的结果不会很好。我认为您的问题没有直接关系,如果不自己进行大量研究,我无法回答,抱歉。
  • 我认为它是相关的,因为有人在 cmets 中建议连续变换可能是解决方案,因为它可以考虑比输入信号更长的周期的正弦,而离散变换不会超出信号长度。我不知道离散连续变换是否或如何做同样的事情,但我会调查......
  • @Christoph90:如果这样做,您将拥有相同的频率,并且您将计算 f(t-offset) 而不是 f(t) 的傅里叶变换
猜你喜欢
  • 2021-12-02
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 2017-04-19
  • 1970-01-01
相关资源
最近更新 更多