8

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

但是,我发现要获得这个结果,我需要将 FFT 的结果乘以一个 factor 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)
4

1 回答 1

17

请注意,您不是在计算连续时间傅立叶变换,计算机处理离散数据,Numpy 也是如此,如果您查看numpy.fft.fft文档,它会说:

numpy.fft.fft(a, n=None, axis=-1)[来源]

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

此函数使用高效的快速傅里叶变换 (FFT) 算法计算一维 n 点离散傅里叶变换 (DFT)

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

在此处输入图像描述

连续时间傅里叶变换定义为:

在此处输入图像描述

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

在此处输入图像描述

正如您所看到的,有一个常数因子1/N正是您的比例值dtx[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()

在此处输入图像描述

于 2013-11-14T11:12:05.810 回答