2016-05-23 4 views
0

Я пытаюсь создать программное обеспечение, чтобы использовать его для анализа данных, которые у меня есть на файле. У меня нет информации о частоте дискретизации, при которой данные были захвачены. Есть ли способ найти частоту моего сигнала, учитывая, что я могу играть с частотой дискретизации моего сигнала? Я попробовал написать код, чтобы найти БПФ синусоидальной волны с частотой 100 Гц, но когда я рисую fft моего сигнала, частота сигнала не соответствует частоте на оси fft. Вот полный код для вашей справки.fft биосигнала неизвестной частотыin python

from scipy import * 
import numpy as np 
import matplotlib.pyplot as plt 
from Tkinter import * 
import tkFileDialog 

class FFTGUI(object): 
    def __init__(self, master): 
     self.master = master 
     self.layout_init(self.master) 

    def layout_init(self, master): 
     self.master = master 
     self.title_label = Label(self.master, text="SIGNAL ANALYSER", font="-weight bold") 
     self.title_label.grid(row=0, column=0, columnspan=2) 

     self.load_data_file_label = Label(self.master, text="LOAD DATA: ") 
     self.load_data_file_label.grid(row=1, column=0) 

     self.load_data_file_button = Button(self.master, text="LOAD",command = self.askopenfilename) 
     self.load_data_file_button.grid(row=1, column=1) 

     self.no_sample_label = Label(self.master, text="ENTER THE NUMBER OF SAMPLE POINTS: ") 
     self.no_sample_label.grid(row=2, column=0) 

     self.no_sample_entry = Entry(self.master, text="Enter Sample") 
     self.no_sample_entry.grid(row=2, column=1) 

     self.sample_spacing_label = Label(self.master, text="ENTER THE SAMPLING SPACE (s):") 
     self.sample_spacing_label.grid(row=3, column=0) 

     self.sample_spacing_entry = Entry(self.master, text="ENTER SPACE") 
     self.sample_spacing_entry.grid(row=3, column=1) 

     self.plot_graph_button = Button(self.master, text="PLOT", command = self.fft_data_plot) 
     self.plot_graph_button.grid(row=4, columnspan =2) 

    def askopenfilename(self): 
     # get filename 
     self.filename = tkFileDialog.askopenfilename() 
     # open file on your own 
     #~ print self.filename 
     if self.filename: 
      return open(self.filename, 'r') 

    def selectfile(self): 
     self.file = tkFileDialog.askopenfilename(parent=root,mode='rb',title='Choose a file') 
     if self.file != None: 
      self.f= np.loadtxt(file, delimiter='\t', skiprows=0, unpack=True) 
      #~ print type(f) 
      return f 

    def fft_data_plot(self): 
     N = int(self.no_sample_entry.get()) 
     SAMPLE_SPACE_T = int(self.sample_spacing_entry.get()) 
     T = 1.0/SAMPLE_SPACE_T 
     lines = [line.rstrip('\n') for line in open(self.filename)] 
     lines = [float(i) for i in lines] 

     #~ print lines 
     yf = fft(lines) 
     yf_power = np.abs(yf)**2 
     energy_yf = 0 

     for i in range(N/2): 
      energy_yf += yf_power[i] 
     #~ print energy_yf 

     energy_nor_yf = [] 
     for i in range(N/2): 
      temp_energy_nor_yf = (yf_power[i]/energy_yf)*100 
      energy_nor_yf.append(temp_energy_nor_yf) 
     #~ print energy_nor_yf 


     plt.subplot(3,1,1) 
     plt.plot(lines) 

     plt.subplot(3,1,2) 
     plt.plot(np.abs(yf)) 
     plt.ylim([0,100]) 
     plt.xlim([0,N/2]) 
     plt.subplot(3,1,3) 
     plt.plot(energy_nor_yf) 
     plt.ylim([0, max(energy_nor_yf)]) 
     plt.show() 



root = Tk() 
FFTGUI(root) 
root.mainloop() 

Файл Я пытаюсь загрузить и проанализировать, можно найти здесь: http://www.filedropper.com/cosine100hz Этот файл представляет собой простой косинусоида, что я сгенерировал на первенствует и полученных данных на косинус волны была добавлена ​​в текстовый файл, так что его можно было бы построить и проанализировать. К сожалению, я, похоже, не знаю, в чем проблема, и почему я не получаю желаемую частоту. Буду признателен за вашу помощь. Спасибо

+0

Я не вижу часть вашего кода, отображающего мощность * по сравнению с частотой *. Вы рисуете его по сравнению с номером компонента, не так ли? – abukaj

+0

Привет, abukaj, Да, я рисую против номера компонента. – Usama

+0

Как вы определили, какой компонент составляет 100 Гц? – abukaj

ответ

1

Единственный способ узнать частоту из чистых образцов - это знать некоторую частоту, присутствующую в вашем сигнале (например, артефакт частоты электросети в данных ЭЭГ).

[EDIT]

Поскольку существует известная частота в вашем сигнале, вы можете обнаружить соотношение выборки (или, скорее, интервал дискретизации). Если вы используете numpy.fft.fft() (я думаю, scipy.fft() метод является псевдонимом для него), вы можете получить частоты соответствующих компонентов с помощью numpy.fft.fftfreq().

Первый аргумент numpy.fft.fftfreq(n, d=1.) - это количество выборок, а второй (d) - интервал выборки (1/f). Вам необходимо найти подходящий d.