There are five basic parameters to design a filter: wp (pass frequency), ws (stop frequency), gpass (pass gain), gstop (stop gain), filter type
The following example code takes data from a phidget analog input and filters this signal using first a IIR filter, then a median and then it calculates the FFT of the whole signal.
import scipy.signal as filters class filter: def __init__(self,wp,ws,gpass,gstop): self.b,self.a=filters.iirdesign(wp,ws,gpass,gstop,ftype='ellip') self.z=filters.lfiltic(self.b,self.a,[]) self.M=len(self.b)-1 self.N=len(self.a)-1 self.K=max(self.M,self.N) def get_output(self,input): '''input must be of size N''' self.output,self.z=filters.lfilter(self.b,self.a,input,zi=self.z) return(self.output) def get_N(self): return self.N def get_ab(self): return([self.a,self.b])
N=property(get_N) from Phidgets.PhidgetException import * from Phidgets.Events.Events import * from Phidgets.Devices import * import numpy as n ik=InterfaceKit.InterfaceKit() ik.openPhidget() ik.waitForAttach(10000) my_filter=filter(0.1,0.3,1,60) N=my_filter.N time_array=[] total_input=[] total_output=[] import time inittime=time.time() while True: t=[] input=[] for i in range(N): t.append(time.time()-inittime) input.append(ik.getSensorValue(0)) time.sleep(0.05) output=my_filter.get_output(input) time_array=n.concatenate((time_array,t)) total_input=n.concatenate((total_input,input)) total_output=n.concatenate((total_output,output)) if t[-1]>10: break total_output_median=filters.medfilt(total_input,kernel_size=11) import Gnuplot g=Gnuplot.Gnuplot() g.title("filter") g('set data style linespoints') g.plot(zip(time_array,total_input),zip(time_array,total_output)) raw_input() import scipy from math import pi fft=scipy.fft(total_input) g.plot(zip(n.arange(0,pi,pi/len(fft)),fft[0:len(fft)/2])) raw_input() g.plot(zip(time_array,total_input),zip(time_array,total_output_median)) a,b=my_filter.get_ab() w,h=filters.freqz(b,a) from numpy import log10 h_db=20*log10(abs(h)) raw_input() g.plot(zip(w/max(w),h_db)) while True: time.sleep(0.1)