[Scipy-tickets] [SciPy] #1706: Error in Cookbook "Savitzky Golay"

SciPy Trac scipy-tickets@scipy....
Tue Aug 7 23:17:54 CDT 2012


#1706: Error in Cookbook "Savitzky Golay"
-------------------------------------+--------------------------------------
 Reporter:  thomas.haslwanter        |       Owner:  pv         
     Type:  defect                   |      Status:  new        
 Priority:  normal                   |   Milestone:  Unscheduled
Component:  Documentation            |     Version:  0.10.0     
 Keywords:  Cookbook Savitzky-Golay  |  
-------------------------------------+--------------------------------------

Comment(by warren.weckesser):

 I agree--an implementation of the Savitzly-Golay filter should be in
 scipy.  I also noticed some problems with the cookbook code a while ago,
 and starting rewriting it, but I only worked on the 1-d case.  I also
 wanted to break the function down into even simpler functions.  I
 implemented a function that just computes the coefficients of the filter.
 This allows the coefficients to be reused without having to compute them
 again.

 Here's the function:
 {{{
 import numpy as np
 from scipy.linalg import lstsq


 def savitzky_golay_fir(window_length, polyorder, deriv=0):
     """Compute the coefficients for a 1-d Savitzky-Golay FIR filter.

     Parameters
     ----------
     window_length : input
         The length of the filter (i.e. the number of coefficients).
     polyorder : int
         The order of the polynomial used to fit the samples.
     deriv : int, optional
         The order of the derivative to compute.  This must be a
         nonnegative integer.  The default is 0, which means to filter
         the data without differentiating.

     Returns
     -------
     c : 1-d ndarray
         The filter coefficients.

     Notes
     -----
     Use any convolution function (e.g. numpy.convolve,
 scipy.ndimage.convolve1d)
     to apply the filter to an array.

     References
     ----------
     A. Savitzky, M. J. E. Golay, Smoothing and Differentiation of Data by
     Simplified Least Squares Procedures. Analytical Chemistry, 1964, 36
 (8),
     pp 1627-1639.

     Examples
     --------
     >>> savitzky_golay_fir(5, 2)
     array([-0.08571429,  0.34285714,  0.48571429,  0.34285714,
 -0.08571429])
     >>> savitzky_golay_fir(5, 2, deriv=1)
     array([  2.00000000e-01,   1.00000000e-01,   2.00607895e-16,
             -1.00000000e-01,  -2.00000000e-01])
     """
     k = window_length // 2
     x = np.linspace(-k, k, window_length)
     ord = np.arange(polyorder + 1)
     A = x ** ord[:, np.newaxis]
     y = np.zeros(polyorder + 1)
     y[deriv] = (-1.0) ** deriv
     c = lstsq(A, y)
     return c[0][:,0]
 }}}

 This could be used in a higher level function that combines computing the
 coefficients with performing the convolution with a given input and
 optionally padding the input.

 It would be nice to have the 2-d version, too (and perhaps an n-d
 version?).

 I'll work a pull request as soon as a I can (or review a PR if someone
 beats me to it).

-- 
Ticket URL: <http://projects.scipy.org/scipy/ticket/1706#comment:3>
SciPy <http://www.scipy.org>
SciPy is open-source software for mathematics, science, and engineering.


More information about the Scipy-tickets mailing list