filterTools.py
Go to the documentation of this file.
1 '''
2 Created on Feb 26, 2014
3 
4 @author: waltj
5 '''
6 import numpy as np
7 from numpy import r_, c_, dot
8 from pickle import FALSE
9 
10 def integral(time, data):
11  size = np.shape(time)[0]
12  result = np.zeros(np.shape(data))
13  integral = data[0]
14  dt = 0
15  for i in range(1, size):
16  dt = time[i] - time[i-1]
17  integral += data[i] * dt
18  result[i] = integral
19  return result
20 
21 # Non-causal, depends on future estimates and output is not delayed.
22 def derivative(time, data, delta=1):
23  size = np.shape(time)[0]
24  result = np.zeros(np.shape(data))
25  for i in range(delta, size-delta):
26  dt = time[i+delta] - time[i-delta]
27  if dt != 0:
28  result[i] = (data[i+delta] - data[i-delta]) / dt
29  else:
30  result[i] = 0;
31 
32  return result
33 
34 # Causal, doesn't depend on future value, but output is 1/2 a sample delayed.
35 def derivativeCausal(time, data, delta=1):
36  size = np.shape(time)[0]
37  result = np.zeros(np.shape(data))
38  for i in range(delta, size):
39  dt = time[i] - time[i-delta]
40  if dt != 0:
41  result[i] = (data[i] - data[i-delta])/dt
42  else:
43  result[i] = 0;
44 
45  return result
46 
47 # delta = number of adjacent points to average in
48 def meanDerivative(time, data, derDelta=1, avgdelta=1):
49  der = derivative(time, data, derDelta)
50 
51  return smooth(der, avgdelta)
52 
53 
54 # Smooth data with delta number of adjacent samples (i.e. delta=2 averages
55 # the 2 samples before and after with the current sample)
56 def smooth(data, delta):
57  size = np.shape(data)[0]
58  result = np.copy(data)
59  mul = 1/(delta*2.0 + 1.0)
60  for i in range(delta, size-delta):
61  result[i] = data[i]
62  for j in range(1,delta+1):
63  result[i] += data[i-j] + data[i+j]
64  result[i] *= mul
65 
66  return result
67 
68 
69 def smooth2(data, delta, step):
70  size = np.shape(data)[0]
71  size2 = int(size/step)
72 
73  result = data[:size2]
74  mul = 1/(delta*2.0 + 1.0)
75  for i in range(delta, size-delta):
76  k = i/step
77  if k < size2:
78  result[k] = data[i]
79  if i+delta < size:
80  for j in range(1,delta+1):
81  result[k] += data[i-j] + data[i+j]
82  result[k] *= mul
83 
84  result[-1] = result[-2]
85 
86  return result
87 
88 
89 def lpf(data, cornerFreqHz, dt=None, time=None, initVal=None):
90  size = np.shape(data)[0]
91 
92  if dt is None and time is None:
93  print("Error: both dt and time are None")
94  return
95 
96  # Find average dt in time
97  if time is None and dt is None:
98  dt = np.mean( time[1:] - time[0:-1] )
99 # print "LPF mean dt: ", dt
100 
101  result = np.copy(data)
102  alpha = dt*cornerFreqHz / (1.0 + dt*cornerFreqHz)
103  beta = 1.0 - alpha
104 
105  if initVal is not None:
106  result[0] = initVal
107 
108  for i in range(1,size):
109  result[i] = beta*result[i-1] + alpha*data[i]
110 
111  return result
112 
113 
114 def lpfNoDelay(data, cornerFreqHz, dt=None, time=None, initVal=None):
115  size = np.shape(data)[0]
116 
117  if dt is None and time is None:
118  print("Error: both dt and time are None")
119  return
120 
121  # Find average dt in time
122  if time is not None and dt is None:
123  dt = np.mean( time[1:] - time[0:-1] )
124 # print "LPF mean dt: ", dt
125 
126  result = np.copy(data)
127  result2 = np.copy(data)
128  alph = dt*cornerFreqHz / (1.0 + dt*cornerFreqHz)
129  beta = 1.0 - alph
130 
131  if initVal is not None:
132  result[0,:] = initVal
133  else:
134  result[0,:] = np.mean(result, axis=0)
135 
136  for i in range(1,size):
137  result[i,:] = beta*result[i-1,:] + alph*data[i,:]
138 
139  # init using last value
140  result2[-1,:] = result[-1,:]
141 
142  # Now LPF in reverse direction
143  for i in range(size-1,0,-1):
144  result2[i-1,:] = beta*result2[i,:] + alph*result[i-1,:]
145 
146  return result2
147 
148 
149 def o1lpf(data, cornerFreqHz, dt=None, time=None, initVal=None):
150  size = np.shape(data)[0]
151 
152  if dt is None and time is None:
153  print("Error: both dt and time are None")
154  return
155 
156  # Find average dt in time
157  if time is not None and dt is None:
158  dt = np.mean( time[1:] - time[0:-1] )
159 # print "LPF mean dt: ", dt
160 
161  if time is None:
162  time = np.arange(0, dt*size, dt)
163 
164  alph = dt*cornerFreqHz / (1 + dt*cornerFreqHz)
165  beta = 1.0 - alph
166 
167  result = np.copy(data)
168 
169  # Estimate inital model
170  c1 = (data[1] - data[0])/(time[1] - time[0])
171 
172  for i in range(1,size):
173  h = i-1
174 
175  dt = time[i] - time[h]
176 
177 # # Estimate next model
178 # # dy = data[i] - data[h]
179 # dy = data[i] - result[h]
180 # d1 = dy/dt
181 #
182 # # Alpha filter coefficient
183 # c1 = beta*c1 + alph*d1
184 #
185 # # Current state estimate
186 # result[i] = result[h] + c1*dt
187 #
188 # # LPF input into current state estimate
189 # result[i] = beta*result[i] + alph*data[i]
190 
191  # Estimate next model coefficient
192  # LPF filter this coefficient
193  c1 = beta*c1 + alph*( (data[i] - result[h])/dt )
194 
195  # Current state estimate
196  # LPF input into current state estimate
197  result[i] = beta*(result[h] + c1*dt) + alph*data[i]
198 
199  return result
200 
201 # Recursive Least Squares - Linear, fixed time interval model
202 # k is forgetting factor, smaller - more remembering
203 def rls_array(meas, k):
204  s = np.shape(meas)
205  if np.shape(s)[0] == 1:
206  wide = 1
207  meas = r_[c_[meas]]
208  else:
209  wide = np.shape(meas)[1]
210 
211  size = np.shape(meas)[0]
212  est = np.zeros(np.shape(meas))
213 
214 # print np.shape(meas), " ", meas
215 # print "size: ", size
216 # print "wide: ", wide
217 
218  # Initialization
219  est[0] = meas[0]
220  A = r_[ c_[ np.ones(wide), np.zeros(wide) ] ] # [ [1], [slope] ]
221  Z = r_[ c_[ meas[0,:], np.ones(wide)] ].T
222 
223 # print "A: ", A
224 # print "Z: ", Z
225 
226  for i in range(0, size-1):
227  # Update model
228  err = meas[i] - est[i]
229  X = est[i] + k*err
230  Z[0,:] = est[i]
231  A = dot( X, dot( Z.T, np.linalg.inv( dot(Z,Z.T) ) ) )
232 
233 # A[0] = 1
234 # print A
235 
236  # Next estimate
237 # print dot( A, Z ).T
238  est[i+1,:] = dot( A, Z ).T
239 
240  return (est, A)
241 
242 
243 
244 
245 
def lpf(data, cornerFreqHz, dt=None, time=None, initVal=None)
Definition: filterTools.py:89
def meanDerivative(time, data, derDelta=1, avgdelta=1)
Definition: filterTools.py:48
def smooth2(data, delta, step)
Definition: filterTools.py:69
def integral(time, data)
Definition: filterTools.py:10
GeneratorWrapper< T > range(T const &start, T const &end, T const &step)
Definition: catch.hpp:4141
def smooth(data, delta)
Definition: filterTools.py:56
def o1lpf(data, cornerFreqHz, dt=None, time=None, initVal=None)
Definition: filterTools.py:149
def derivativeCausal(time, data, delta=1)
Definition: filterTools.py:35
def lpfNoDelay(data, cornerFreqHz, dt=None, time=None, initVal=None)
Definition: filterTools.py:114
def derivative(time, data, delta=1)
Definition: filterTools.py:22


inertial_sense_ros
Author(s):
autogenerated on Sat Sep 19 2020 03:19:04