glidertools.cleaning.savitzky_golay

glidertools.cleaning.savitzky_golay(var, window_size, order, deriv=0, rate=1, interpolate=True)

Smooth (and optionally differentiate) data with a Savitzky-Golay filter.

The Savitzky-Golay filter removes high frequency noise from data [1]. It has the advantage of preserving the original shape and features of the signal better than other types of filtering approaches, such as moving averages techniques. By default, nans in the array are interpolated with a limit set to the window size of the dataset before smoothing. The nans are inserted back into the dataset after the convolution. This limits the loss of data over blocks where there are nans. This can be switched off with the interpolate keyword arguement.

Parameters:
  • var (array, dtype=float, shape=[n, ]) – the values of the time history of the signal.

  • window_size (int) – the length of the window. Must be an odd integer number.

  • order (int) – the order of the polynomial used in the filtering. Must be less then window_size - 1.

  • deriv (int) – the order of the derivative to compute (default = 0 means only smoothing)

  • interpolate (bool=True) – By default, nans in the array are interpolated with a limit set to the window size of the dataset before smoothing. The nans are inserted back into the dataset after the convolution. This limits the loss of data over blocks where there are nans. This can be switched off with the interpolate keyword arguement.

Returns:

ys – the smoothed signal (or it’s n-th derivative).

Return type:

ndarray, shape (N)

Notes

The Savitzky-Golay is a type of low-pass filter, particularly suited for smoothing noisy data. The main idea behind this approach is to make for each point a least-square fit with a polynomial of high order over a odd-sized window centered at the point [2].

Examples

>>> t = linspace(-4, 4, 500)
    y = exp( -t**2 ) + random.normal(0, 0.05, t.shape)
    ysg = savitzky_golay(y, window_size=31, order=4)
    import matplotlib.pyplot as plt
    plt.plot(t, y, label='Noisy signal')
    plt.plot(t, exp(-t**2), 'k', lw=1.5, label='Original signal')
    plt.plot(t, ysg, 'r', label='Filtered signal')
    plt.legend()
    plt.show()

References