У меня есть доступ к numpy и scipy и вы хотите создать простой БПФ набора данных. У меня есть два списка, которые являются значениями y, а другие - отметками времени для этих значений y.
Каков самый простой способ подачи этих списков в метод scipy или numpy и построить результирующий FFT?
Я искал примеры, но все они полагаются на создание набора поддельных данных с некоторым количеством точек данных, частотой и т.д., и на самом деле не показывают, как это сделать с помощью всего набора данных и соответствующие метки времени.
Я попробовал следующий пример:
from scipy.fftpack import fft
# Number of samplepoints
N = 600
# sample spacing
T = 1.0 / 800.0
x = np.linspace(0.0, N*T, N)
y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)
yf = fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N/2)
import matplotlib.pyplot as plt
plt.plot(xf, 2.0/N * np.abs(yf[0:N/2]))
plt.grid()
plt.show()
Но когда я изменяю аргумент fft на свой набор данных и рисую его, я получаю крайне нечетные результаты, похоже, масштабирование частоты может быть отключено. Я не уверен.
Вот пастебин данных, которые я пытаюсь выполнить FFT
http://pastebin.com/0WhjjMkb http://pastebin.com/ksM4FvZS
Когда я делаю fft в целом, у него просто огромный пик в ноль и ничего больше
Вот мой код:
## Perform FFT WITH SCIPY
signalFFT = fft(yInterp)
## Get Power Spectral Density
signalPSD = np.abs(signalFFT) ** 2
## Get frequencies corresponding to signal PSD
fftFreq = fftfreq(len(signalPSD), spacing)
## Get positive half of frequencies
i = fftfreq>0
##
plt.figurefigsize=(8,4));
plt.plot(fftFreq[i], 10*np.log10(signalPSD[i]));
#plt.xlim(0, 100);
plt.xlabel('Frequency Hz');
plt.ylabel('PSD (dB)')
интервал просто равен xInterp[1]-xInterp[0]