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

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)

在此输入图像描述

  • 非常感谢。这确实应该是非常明显的。顺便问一下,您知道为什么标准 fft 例程中没有考虑该因素吗?我的猜测是大多数人使用 fft,然后做一些事情,然后使用 ifft,因此该因子被丢弃以节省计算时间。正确的 ? (2认同)