python中的fft没有在正确的位置显示峰值

Coo*_*rab 7 python fft

我正在尝试理解numpy fft函数,因为我的数据减少很奇怪.但是现在我已经改变了两个正弦的简单总和,我得到了奇怪的结果.我所拥有的峰值非常高,在零附近有几个点宽,其余部分变平.有没有人知道我可能做错了什么?

import numpy as np
from numpy import exp, sqrt, pi, linspace
from matplotlib import cm
import matplotlib.pyplot as plt
import scipy as sp
import pylab


#fourier
tdata = np.arange(5999.)/300
datay = 3*np.sin(tdata)+6*np.sin(2*tdata)
fouriery =  np.fft.fft(datay)

freqs = np.fft.fftfreq(datay.size, d=0.1)


pylab.plot(freqs,fouriery)
pylab.show()
Run Code Online (Sandbox Code Playgroud)

我得到的是这个: 在此输入图像描述 虽然它两侧应该有两个侧峰,但其中一个比另一个高2倍

unu*_*tbu 4

  • datay是真实的,所以也许你应该使用 FFT 对真实序列进行 FFT scipy.fftpack.rfft
  • 如果您正在寻找具有两个不同峰值的 FFT,那么您必须为其提供数据,该数据是正弦波的总和,其项的周期是 的整数倍2*pi/n,其中n = len(datay)。如果不是,将需要许多这样的正弦波来近似数据。

import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack as fftpack

pi = np.pi
tdata = np.arange(5999.)/300
datay = 3*np.sin(2*pi*tdata)+6*np.sin(2*pi*2*tdata)
fouriery = fftpack.rfft(datay)
freqs = fftpack.rfftfreq(len(datay), d=(tdata[1]-tdata[0]))
plt.plot(freqs, fouriery, 'b-')
plt.xlim(0,3)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 不同的人定义傅里叶变换的方式不同,通常因涉及 2、pi 和“N”的因素而异。您可能必须返回到[scipy.fftpack.rfft正在使用的定义](http://docs.scipy.org/doc/scipy/reference/ generated/scipy.fftpack.rfft.html)并进行比较到您正在拟合的理论曲线中使用的定义。`N/(2*pi)` 约为 1000,因此这可能是差异的根源。 (2认同)