numpy的fft结果的幅度乘以采样周期?

时间:2013-11-14 10:18:24

标签: python numpy fft dft

我尝试通过一个例子来验证我对Numpy的FFT的理解:当没有对直接变换应用缩放时,exp(-pi*t^2)的傅里叶变换应该是exp(-pi*f^2)

然而,我发现为了获得这个结果,我需要将FFT的结果乘以因子dt,这是我函数上两个采样点之间的时间间隔。我不明白为什么。有人可以帮忙吗?

以下是示例代码:

# create data
N = 4097
T = 100.0
t = linspace(-T/2,T/2,N)
f = exp(-pi*t**2)

# perform FT and multiply by dt
dt = t[1]-t[0]
ft = fft(f)  * dt      
freq = fftfreq( N, dt )
freq = freq[:N/2+1]

# plot results
plot(freq,abs(ft[:N/2+1]),'o')
plot(freq,exp(-pi*freq**2),'r')
legend(('numpy fft * dt', 'exact solution'),loc='upper right')
xlabel('f')
ylabel('amplitude')
xlim(0,1.4)

1 个答案:

答案 0 :(得分:12)

小心,你没有计算连续时间傅立叶变换,计算机使用离散数据,Numpy也是如此,如果你看一下它所说的numpy.fft.fft文档:

  

numpy.fft.fft(a,n =无,轴= -1)[来源]

     

计算一维离散傅里叶变换。

     

该函数利用有效的快速傅里叶变换(FFT)算法计算一维n点离散傅立叶变换(DFT)

这意味着您正在计算由等式定义的DFT:

enter image description here

连续时间傅立叶变换由下式定义:

enter image description here

如果你做数学来寻找它们之间的关系:

enter image description here

正如您所看到的,有一个常数因子1/N,它正是您的比例值dtx[n] - x[n-1],其中n在[0,T]中,间隔等于{{1 }})。


只是对您的代码发表评论,导入所有内容1/N代替使用不是一个好习惯:

from numpy import *

enter image description here