Как вводить данные в БПФ

Итак, у меня есть два массива данных:

Bx = [  -59.57011259   -74.20675537   -90.53224156 ..., -1676.9703173
-1676.9703173  -1676.9703173 ]
By = [  1.48413511e+00   4.96417605e+00   8.39303992e+00 ...,  -1.67697032e+03
-1.67697032e+03  -1.67697032e+03]

как мне поставить их, чтобы получить БПФ, который выглядит так?

У меня есть программа, которая показывает мне эти данные, но мне нужно сделать это в Python2.7. Я пытался использовать этот код, который я нашел в этой теме ( Построение быстрого преобразования Фурье в Python), но, честно говоря, у меня есть проблемы с пониманием БПФ, вы можете помочь?

# Number of samples
N = 600
# Sample spacing
T = 300.0 / 266336
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)
plt.plot(xf, 2.0/N * np.abs(yf[0:N/2]))
plt.grid()
plt.show()

Немного информации о моих данных: количество записей / образцов 266336; время 300 с = 300000 мс

Мне также нужно как-то реализовать blackman или окно Хэмминга, вы можете помочь?

2 ответа

Решение

Я использовал метод Уэлча, который был хорошей идеей. Конец поста. Задача решена.

# Loop for FFT data
for dataset in [fft1]:
    dataset = np.asarray(dataset)
    freqs, psd = welch(dataset, fs=266336/300, window='hamming', nperseg=8192)
    plt.semilogy(freqs, psd/dataset.size**2, color='r')

for dataset2 in [fft2]:
    dataset2 = np.asarray(dataset2)
    freqs2, psd2 = welch(dataset2, fs=266336/300, window='hamming', nperseg=8192)
    plt.semilogy(freqs2, psd2/dataset2.size**2, color='b')

При условии, что Bx а также By похожи на массивы, управление окнами может быть записано * оператор.

import numpy as np
import matplotlib.pyplot as plt

# Number of samplepoints
N = 266336
# sample spacing
T = 300.0 / N

# Window
win = np.hamming(N)

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)
y = np.array(Bx)
y_win = win * y
yf = np.fft.fft(y_win)
xf = np.linspace(0.0, 1.0/(2.0*T), N/2)

# Plot original data
ax = plt.subplot(3,1,1)
ax.grid()
ax.plot(y)

# Plot windowed data
ax = plt.subplot(3,1,2)
ax.grid()
ax.plot(y_win)

# Plot spectrum
ax = plt.subplot(3,1,3)
ax.grid()
ax.plot(xf, 2.0/N * np.abs(yf[:N/2]))
plt.show()
Другие вопросы по тегам