我尝试通过一个例子来验证我对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)
答案 0 :(得分:12)
小心,你没有计算连续时间傅立叶变换,计算机使用离散数据,Numpy也是如此,如果你看一下它所说的numpy.fft.fft
文档:
numpy.fft.fft(a,n =无,轴= -1)[来源]
计算一维离散傅里叶变换。
该函数利用有效的快速傅里叶变换(FFT)算法计算一维n点离散傅立叶变换(DFT)
这意味着您正在计算由等式定义的DFT:
连续时间傅立叶变换由下式定义:
如果你做数学来寻找它们之间的关系:
正如您所看到的,有一个常数因子1/N
,它正是您的比例值dt
(x[n] - x[n-1]
,其中n在[0,T]中,间隔等于{{1 }})。
只是对您的代码发表评论,导入所有内容1/N
代替使用不是一个好习惯:
from numpy import *