2014-09-29 3 views
1

У меня есть данные для Velocity vs time. Временные шаги неравномерны, но данные Velocity - это волна. Как рассчитать основную частоту скорости с помощью FFT Python? Большинство примеров, которые я просматриваю в Интернете, предназначены для равномерного шага времени.Как рассчитать частоту волны подачи и времени

Мои данные как

7.56683038E+02 2.12072850E-01 
7.56703750E+02 2.13280844E-01 
7.56724461E+02 2.14506402E-01 
7.56745172E+02 2.15748934E-01 
7.56765884E+02 2.17007907E-01 
7.56786595E+02 2.18282753E-01 

10000 линий, как это.

Видя некоторые онлайн ответы, я написал подобный код, но он не работает:

#!/usr/bin/env python 

import numpy as np 
import scipy as sy 
import scipy.fftpack as syfp 
import pylab as pyl 

# Calculate the number of data points 
length = 0 
for line in open("data.dat"): 
    length = length + 1 

# Read in data from file here 
t = np.zeros(shape=(length,1)) 
u = np.zeros(shape=(length,1)) 


length = 0 
for line in open("data.dat"): 
    columns = line.split(' ') 
    t[length] = float(columns[0]) 
    u[length] = float(columns[1]) 
    length = length + 1 

# Do FFT analysis of array 
FFT = sy.fft(u) 

# Getting the related frequencies 
freqs = syfp.fftfreq(len(u)) 

# Create subplot windows and show plot 
pyl.subplot(211) 
pyl.plot(t, u) 
pyl.xlabel('Time') 
pyl.ylabel('Amplitude') 
pyl.subplot(212) 
pyl.plot(freqs, sy.log10(FFT), 'x') 
pyl.show() 

-------------------- - edit ------------------------

с этим кодом Я получаю вывод, как на следующем рисунке. Я не уверен, что показывает этот рисунок. Я ожидал увидеть только один пик на диаграмме FFT Output by the python program

---------------------- edit --------- ---------------

Мои результаты с данными фиктивных с функциями грех, предложенных в комментариях ниже здесь:

results of the mock data

+1

Что вы подразумеваете под словом "it is not working"? Кроме того, что вы подразумеваете под «основной частотой»? – tom10

+0

На графике FFT, что вы видите, если вы занесете 'sy.log10 (np.abs (FFT))' (то есть обратите внимание на использование 'abs' там). – tom10

+0

, который ничего не меняет в выходе.Кстати, я проверил, и временные шаги выглядят почти единообразными с dt = 0.02071, и у меня есть 100000 точек данных в моем файле. – jhaprade

ответ

1

Из того, что я могу см., ваш код в основном прекрасен, но не хватает нескольких деталей. Я думаю, что ваши проблемы в основном связаны с интерпретацией. Из-за этого макет данных лучше всего смотреть сейчас, и вот пример с макетными данными, которые я предложил в комментариях (и я добавил комментарии о важных строках и ## для изменений):

import numpy as np 
import scipy as sy 
import scipy.fftpack as syfp 
import pylab as pyl 

dt = 0.02071 
t = dt*np.arange(100000)    ## time at the same spacing of your data 
u = np.sin(2*np.pi*t*.01)   ## Note freq=0.01 Hz 

# Do FFT analysis of array 
FFT = sy.fft(u) 

# Getting the related frequencies 
freqs = syfp.fftfreq(len(u), dt)  ## added dt, so x-axis is in meaningful units 

# Create subplot windows and show plot 
pyl.subplot(211) 
pyl.plot(t, u) 
pyl.xlabel('Time') 
pyl.ylabel('Amplitude') 
pyl.subplot(212) 
pyl.plot(freqs, sy.log10(abs(FFT)), '.') ## it's important to have the abs here 
pyl.xlim(-.05, .05)      ## zoom into see what's going on at the peak 
pyl.show() 

enter image description here

Как можно видеть, существует два пика, при + и - входная частота (Гц 0,01), как и ожидалось.

Редактировать:
Озадаченных, почему этот подход не работает для данных Ора, я тоже решил посмотреть на это. Проблема в том, что времена выборки не равномерно распределены. Вот гистограмма времени (код ниже).

enter image description here

Таким образом, время между образцами грубо равномерно распределены между короткое время и долгое время. Я быстро взглянул на образец, и ничего не было видно.

Чтобы сделать FFT, необходимо равномерно разнесенных выборок времени, поэтому я интерполированное получить следующее:

enter image description here

, который является разумным (постоянное смещение, основной пик и небольшая гармоника). Вот код:

data = np.loadtxt("data.dat", usecols=(0,1)) 
t = data[:,0] 
u = data[:,1] 

tdiff = t[1:]-t[:-1] 
plt.hist(tdiff) 

new_times = np.linspace(min(t), max(t), len(t)) 
new_data = np.interp(new_times, t, u) 

t, u = new_times, new_data 

FFT = sy.fft(u) 
freqs = syfp.fftfreq(len(u), dt) 

# then plot as above 
+0

спасибо за ваш ответ. Это похоже на то, что код делает правильные вещи. Я внес изменения, которые вы рекомендовали. Но все же, после ввода моих данных, выход FFT, который я получаю, похож на волну (как показано на первой фигуре моего вопроса). Мои исходные данные выглядят как плавная волна, поэтому я не знаю, как интерпретировать мой вывод. – jhaprade

+0

@jhaprade: Я закончил тем, что был озадачен этим, поэтому я сделал это и включил ответ на вашу проблему с данными в редактировании. – tom10

+0

большое спасибо @ tom10. это было очень мило с вашей стороны :) – jhaprade

 Смежные вопросы

  • Нет связанных вопросов^_^