# [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.
```