1313#########################
1414# Savitzky-Golay filter #
1515#########################
16- def savgoldiff (x , dt , params = None , options = None , polynomial_order = None , window_size = None , smoothing_win = None ):
16+ def savgoldiff (x , dt , params = None , options = None , poly_order = None , window_size = None , smoothing_win = None ):
1717 """Use the Savitzky-Golay to smooth the data and calculate the first derivative. It wses
1818 scipy.signal.savgol_filter. The Savitzky-Golay is very similar to the sliding polynomial fit,
1919 but slightly noisier, and much faster
2020
2121 :param np.array[float] x: data to differentiate
2222 :param float dt: step size
23- :param list params: (**deprecated**, prefer :code:`polynomial_order `, :code:`window_size`, and :code:`smoothing_win`)
23+ :param list params: (**deprecated**, prefer :code:`poly_order `, :code:`window_size`, and :code:`smoothing_win`)
2424 :param dict options: (**deprecated**)
25- :param int polynomial_order : order of the polynomial
25+ :param int poly_order : order of the polynomial
2626 :param int window_size: size of the sliding window, must be odd (if not, 1 is added)
2727 :param int smoothing_win: size of the window used for gaussian smoothing, a good default is
2828 window_size, but smaller for high frequnecy data
@@ -32,17 +32,17 @@ def savgoldiff(x, dt, params=None, options=None, polynomial_order=None, window_s
3232 - **dxdt_hat** -- estimated derivative of x
3333 """
3434 if params != None : # Warning to support old interface for a while. Remove these lines along with params in a future release.
35- warn ("`params` and `options` parameters will be removed in a future version. Use `polynomial_order `, " +
35+ warn ("`params` and `options` parameters will be removed in a future version. Use `poly_order `, " +
3636 "`window_size`, and `smoothing_win` instead." , DeprecationWarning )
37- polynomial_order , window_size , smoothing_win = params
38- elif polynomial_order == None or window_size == None or smoothing_win == None :
39- raise ValueError ("`polynomial_order `, `window_size`, and `smoothing_win` must be given." )
37+ poly_order , window_size , smoothing_win = params
38+ elif poly_order == None or window_size == None or smoothing_win == None :
39+ raise ValueError ("`poly_order `, `window_size`, and `smoothing_win` must be given." )
4040
41- window_size = np .clip (window_size , polynomial_order + 1 , len (x )- 1 )
41+ window_size = np .clip (window_size , poly_order + 1 , len (x )- 1 )
4242 if not window_size % 2 : window_size += 1 # window_size needs to be odd
4343 smoothing_win = min (smoothing_win , len (x )- 1 )
4444
45- dxdt_hat = scipy .signal .savgol_filter (x , window_size , polynomial_order , deriv = 1 )/ dt
45+ dxdt_hat = scipy .signal .savgol_filter (x , window_size , poly_order , deriv = 1 )/ dt
4646
4747 kernel = utility .gaussian_kernel (smoothing_win )
4848 dxdt_hat = utility .convolutional_smoother (dxdt_hat , kernel )
@@ -57,16 +57,16 @@ def savgoldiff(x, dt, params=None, options=None, polynomial_order=None, window_s
5757######################
5858# Polynomial fitting #
5959######################
60- def polydiff (x , dt , params = None , options = None , polynomial_order = None , window_size = None , step_size = 1 ,
60+ def polydiff (x , dt , params = None , options = None , poly_order = None , window_size = None , step_size = 1 ,
6161 kernel = 'friedrichs' ):
6262 """Fit polynomials to the data, and differentiate the polynomials.
6363
6464 :param np.array[float] x: data to differentiate
6565 :param float dt: step size
66- :param list[int] params: (**deprecated**, prefer :code:`polynomial_order ` and :code:`window_size`)
66+ :param list[int] params: (**deprecated**, prefer :code:`poly_order ` and :code:`window_size`)
6767 :param dict options: (**deprecated**, prefer :code:`step_size` and :code:`kernel`)
6868 a dictionary consisting of {'sliding': (bool), 'step_size': (int), 'kernel_name': (str)}
69- :param int polynomial_order : order of the polynomial
69+ :param int poly_order : order of the polynomial
7070 :param int window_size: size of the sliding window, if not given no sliding
7171 :param int step_size: step size for sliding
7272 :param str kernel: name of kernel to use for weighting and smoothing windows ('gaussian' or 'friedrichs')
@@ -76,24 +76,27 @@ def polydiff(x, dt, params=None, options=None, polynomial_order=None, window_siz
7676 - **dxdt_hat** -- estimated derivative of x
7777 """
7878 if params != None :
79- warn ("`params` and `options` parameters will be removed in a future version. Use `polynomial_order ` " +
79+ warn ("`params` and `options` parameters will be removed in a future version. Use `poly_order ` " +
8080 "and `window_size` instead." , DeprecationWarning )
81- polynomial_order = params [0 ]
81+ poly_order = params [0 ]
8282 if len (params ) > 1 : window_size = params [1 ]
8383 if options != None :
8484 if 'sliding' in options and not options ['sliding' ]: window_size = None
8585 if 'step_size' in options : step_size = options ['step_size' ]
8686 if 'kernel_name' in options : kernel = options ['kernel_name' ]
87- elif polynomial_order == None or window_size == None :
88- raise ValueError ("`polynomial_order ` and `window_size` must be given." )
87+ elif poly_order == None or window_size == None :
88+ raise ValueError ("`poly_order ` and `window_size` must be given." )
8989
90- if window_size < polynomial_order * 3 :
91- window_size = polynomial_order * 3 + 1
90+ if window_size < poly_order * 3 :
91+ window_size = poly_order * 3 + 1
92+ if window_size % 2 == 0 :
93+ window_size += 1
94+ warn ("Kernel window size should be odd. Added 1 to length." )
9295
93- def _polydiff (x , dt , polynomial_order , weights = None ):
96+ def _polydiff (x , dt , poly_order , weights = None ):
9497 t = np .arange (len (x ))* dt
9598
96- r = np .polyfit (t , x , polynomial_order , w = weights ) # polyfit returns highest order first
99+ r = np .polyfit (t , x , poly_order , w = weights ) # polyfit returns highest order first
97100 dr = np .polyder (r ) # power rule already implemented for us
98101
99102 dxdt_hat = np .polyval (dr , t ) # evaluate the derivative and original polynomials at points t
@@ -102,10 +105,10 @@ def _polydiff(x, dt, polynomial_order, weights=None):
102105 return x_hat , dxdt_hat
103106
104107 if not window_size :
105- return _polydiff (x , dt , polynomial_order )
108+ return _polydiff (x , dt , poly_order )
106109
107110 kernel = {'gaussian' :utility .gaussian_kernel , 'friedrichs' :utility .friedrichs_kernel }[kernel ](window_size )
108- return utility .slide_function (_polydiff , x , dt , kernel , polynomial_order , stride = step_size , pass_weights = True )
111+ return utility .slide_function (_polydiff , x , dt , kernel , poly_order , stride = step_size , pass_weights = True )
109112
110113
111114#############
0 commit comments