fft в python не показывает пики в нужном месте

Я пытаюсь понять функцию 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()

что я получаю это: enter image description here В то время как он должен иметь два sidepeaks с обеих сторон, один из них 2x выше, чем другой

1 ответов


  • код datay реально, поэтому, возможно, вы должны принимать БПФ для реальная последовательность с помощью scipy.fftpack.rfft.
  • если вы ищете БПФ с двумя различными пиками, то вы должны дайте ему данные, которые являются суммой синусоидальных волн, члены которых имеют периоды которые являются целыми кратными 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()

enter image description here