Преобразование Фурье с питоном

1

У меня есть набор данных. Очевидно, он носит периодический характер. Я хочу узнать, какую частоту он использует, используя преобразование Фурье и запечатлеть его.

Вот мой снимок, но это кажется не очень хорошим. Изображение 174551

Это соответствующий код, я не понимаю, почему он терпит неудачу:

import numpy
from pylab import *
from scipy.fftpack import fft,fftfreq
import matplotlib.pyplot as plt
dataset = numpy.genfromtxt(fname='data.txt',skip_header=1)
t = dataset[:,0]
signal = dataset[:,1]
npts=len(t)

FFT = abs(fft(signal))
freqs = fftfreq(npts, t[1]-t[0])
subplot(211)
plot(t[:npts], signal[:npts])
subplot(212)
plot(freqs,20*log10(FFT),',')
xlim(-10,10)
show()

Мой вопрос: Поскольку исходные данные очень периодические, и я ожидаю увидеть, что в частотной области пик очень острый; как я могу сделать пик приятнее?

  • 0
    что не так об этом? что ты ожидал?
  • 0
    @PaulH Почему пик так широк, я вижу, что период исходных данных очень хороший. Как я могу сделать частоту более очевидной?
Теги:
python-2.7
scipy
data-analysis

1 ответ

4
Лучший ответ

Это проблема анализа данных.

  • FFT работает со сложным числом, поэтому спектр является симметричным для реального ввода данных: ограничивайте xlim(0,max(freqs)).
  • Период выборки не является хорошим: увеличение периода с сохранением того же общего количества входных точек приведет к лучшему спектру качества на этом примере.

ИЗМЕНИТЬ. с:

 dataset = numpy.genfromtxt(fname='data.txt',skip_header=1)[::30];
 t,signal = dataset.T
 (...)
 plot(freqs,FFT)
 xlim(0,1)
 ylim(0,30)    

спектр

Изображение 174551

Для наилучшего качества спектра просто повторно закрепите сигнал в течение длительного долгого времени (для красивых пиков) с частотой дискретизации 1 Гц, что даст вам шкалу частоты [0, 0.5 Гц] (см. критерий Найквиста).

  • 0
    Я получил ваше первое замечание, можете ли вы дать более подробное объяснение вашего второго вопроса? я должен заменить "t [1] -t [0]" на "10 * (t [1] -t [0])"? Это тоже не приятно.
  • 1
    Просто проверка моего понимания. Ваша частота дискретизации составляет $ 1 / (30 * 0,005 с) = 6,67 Гц $, согласно критерию Найквиста. Эта частота дискретизации гарантирует, что мы можем восстановить информацию сигнала с частотой $ f <6,67 / 2 = 3,33 Гц $. Итак, на самом деле мы должны нарисовать ось х от 0 до 3,4 Гц.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню