【问题标题】:Odd result in python scipy FFTpython scipy FFT中的奇怪结果
【发布时间】:2019-07-20 22:20:27
【问题描述】:

我可以访问 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()

#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 定理。 。它必须是 S_H_s=S_h*2,但我的结果不是。我认为 FFT 结果的 S_H_s 是错误的值,因为 S_F=S_h*2

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

【问题讨论】:

    标签: python scipy fft


    【解决方案1】:

    我建议你绘制你的输入信号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。

    【讨论】:

      猜你喜欢
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 2015-03-24
      • 1970-01-01
      • 2016-01-22
      • 2014-07-05
      相关资源
      最近更新 更多