Smoothing signals and computing their derivatives is a common
requirement in signal processing workflows. Savitzky-Golay filters are a
established method able to do both (Savitzky and Golay, 1964
The goal of sgolay is to offer efficient and vectorized Savitzky-Golay filters.
You can install the CRAN version with
# install.packages("sgolay")
Or you can install the development version of sgolay from GitHub with:
# install.packages("remotes")
remotes::install_github("zeehio/sgolay")
sgolay is faster than signal, especially on either larger filter
lengths or when applied on matrices, since it uses the Fast Fourier
Transform and avoids several memory copies and extra allocations.
library(sgolay)
x <- matrix(runif(1000*1000), nrow = 1000, ncol = 1000)
filt <- signal::sgolay(p = 2, n = 51)
timing <- bench::mark(
signal = apply(x, 2L, function(s) signal::sgolayfilt(s, filt)),
sgolay = sgolay::sgolayfilt(x, filt),
min_iterations = 50
)
#> Warning: Some expressions had a GC in every iteration; so filtering is disabled.
plot(timing, type = 'ridge')
#> Loading required namespace: tidyr
#> Picking joint bandwidth of 0.0135