use*_*676 5 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)
Run Code Online (Sandbox Code Playgroud)
jab*_*edo 13
要小心,你不是计算连续时间傅里叶变换,计算机使用离散数据,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/N).
只是对您的代码发表评论,导入所有内容并不是一个好习惯,from numpy import *而是使用:
import numpy as np
import matplotlib.pyplot as plt
# create data
N = 4097
T = 100.0
t = np.linspace(-T/2,T/2,N)
f = np.exp(-np.pi*t**2)
# perform FT and multiply by dt
dt = t[1]-t[0]
ft = np.fft.fft(f) * dt
freq = np.fft.fftfreq(N, dt)
freq = freq[:N/2+1]
# plot results
plt.plot(freq, np.abs(ft[:N/2+1]),'o')
plt.plot(freq, np.exp(-np.pi * freq**2),'r')
plt.legend(('numpy fft * dt', 'exact solution'), loc='upper right')
plt.xlabel('f')
plt.ylabel('amplitude')
plt.xlim([0, 1.4])
plt.show()
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
11269 次 |
| 最近记录: |