python scipy FFT的奇数结果

时间:2019-02-27 08:46:45

标签: python scipy fft

我可以访问scipy,并想创建一个有关简单高斯函数的FFT,该函数为 exp(-t ^ 2)。而且众所周知, exp(-t ^ 2)的傅立叶变换是√πexp(-π^ 2 * k ^ 2)。但是 exp(-t ^ 2)的FFT与√πexp(-π^ 2 * k ^ 2)不同。

我尝试了以下代码:

import scipy.fftpack as fft
from scipy import integrate
import numpy as np
import matplotlib.pyplot as plt

#FFT
N=int(1e+3)
T=0.01 #sample period
t = np.linspace(0,N*T, N)

h=np.exp(-t**2)
H_shift=2*np.abs(fft.fftshift(np.fft.fft(h)/N))
freq=fft.fftshift(fft.fftfreq(h.shape[0],t[1]-t[0]))


#Comparing FFT with fourier transform
def f(x):
    return np.exp(-x**2)
def F(k):
    return (np.pi**0.5)*np.exp((-np.pi**2)*(k**2))

plt.figure(num=1)
plt.plot(freq,F(freq),label=("Fourier Transform"))
plt.legend()
plt.figure(num=2)
plt.plot(freq,H_shift,label=("FFT"))
plt.legend()
plt.show()

enter image description here

#Checking Parseval's Theorm
S_h=integrate.simps(h**2,t)
#0.62665690150683084
S_H_s=integrate.simps(H_shift**2,freq)
#0.025215875346935791
S_F=integrate.simps(F(freq)**2,freq)
#1.2533141373154999

我绘制的图不一样,FFT的值也不遵循Parseval定理。 enter image description here。它必须是 S_H_s = S_h * 2 ,但我的结果不是。我认为FFT的结果 S_H_s 是错误的值,因为 S_F = S_h * 2

我的代码有什么问题吗?非常感谢您的帮助!预先感谢。

1 个答案:

答案 0 :(得分:0)

我建议您绘制输入信号h,并确认它看起来像高斯信号。

扰流板警报:不是,它是高斯的一半!

通过这样切割,您会在图中看到很多高频信号。

要正确进行此实验,请按照以下食谱创建您的输入信号:

t = np.linspace(-(N/2)*T,(N/2-1)*T, N)
h = np.exp(-t**2)
h = fft.ifftshift(h)

ifftshift函数用于将t=0位置移动到最左侧的数组元素。请注意,这里的t经过精心构造,使得t=0恰好位于正确位置,以确保N大小均匀。您可以验证fft.ifftshift(t)[0]为0.0。