savitzkyGolay: Savitzky-Golay smoothing and differentiation

View source: R/savitzkyGolay.R

savitzkyGolayR Documentation

Savitzky-Golay smoothing and differentiation

Description

\loadmathjax

Savitzky-Golay smoothing and derivative of a data matrix or vector.

Usage

savitzkyGolay(X, m, p, w, delta.wav)

Arguments

X

a numeric matrix or vector to process (optionally a data frame that can be coerced to a numerical matrix).

m

an integer indcating the differentiation order.

p

an integer indicating the polynomial order.

w

an integer indicating the window size (must be odd).

delta.wav

(optional) sampling interval.

Details

The Savitzky-Golay algorithm fits a local polynomial regression on the signal. It requires evenly spaced data points. Mathematically, it operates simply as a weighted sum over a given window:

\mjdeqn

x_j\ast = \frac1N\sum_h=-k^kc_hx_j+h x_j ast = 1/N \sum_h=-k^k c_hx_j+h

where \mjeqnx_j\astx_j ast is the new value, \mjeqnNN is a normalizing coefficient, \mjeqnkk is the gap size on each side of \mjeqnjj and \mjeqnc_hc_h are pre-computed coefficients, that depends on the chosen polynomial order and degree.

The sampling interval specified with the delta.wav argument is used for scaling and get numerically correct derivatives.

The convolution function is written in C++/Rcpp for faster computations.

Author(s)

Antoine Stevens and Leonardo Ramirez-Lopez

References

Luo, J., Ying, K., He, P., & Bai, J. (2005). Properties of Savitzky–Golay digital differentiators. Digital Signal Processing, 15(2), 122-136.

Savitzky, A., and Golay, M.J.E., 1964. Smoothing and differentiation of data by simplified least squares procedures. Anal. Chem. 36, 1627-1639.

Schafer, R. W. (2011). What is a Savitzky-Golay filter? (lecture notes). IEEE Signal processing magazine, 28(4), 111-117.

Wentzell, P.D., and Brown, C.D., 2000. Signal processing in analytical chemistry. Encyclopedia of Analytical Chemistry, 9764-9800.

Examples

data(NIRsoil)
opar <- par(no.readonly = TRUE)
par(mfrow = c(2, 1), mar = c(4, 4, 2, 2))

# plot of the 10 first spectra
matplot(as.numeric(colnames(NIRsoil$spc)),
  t(NIRsoil$spc[1:10, ]),
  type = "l",
  xlab = "",
  ylab = "Absorbance"
)

mtext("Raw spectra")
NIRsoil$spc_sg <- savitzkyGolay(
  X = NIRsoil$spc,
  m = 1,
  p = 3,
  w = 11,
  delta.wav = 2
)

matplot(as.numeric(colnames(NIRsoil$spc_sg)),
  t(NIRsoil$spc_sg[1:10, ]),
  type = "l",
  xlab = "Wavelength /nm",
  ylab = "1st derivative"
)

mtext("1st derivative spectra")
par(opar)

prospectr documentation built on Aug. 31, 2022, 5:05 p.m.