Description
Efficient Savitzky-Golay Filtering.
Description
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 <doi:10.1021/ac60214a047>). This package implements one dimensional Savitzky-Golay filters that can be applied to vectors and matrices (either row-wise or column-wise). Vectorization and memory allocations have been profiled to reduce computational fingerprint. Short filter lengths are implemented in the direct space, while longer filters are implemented in frequency space, using a Fast Fourier Transform (FFT).
README.md
sgolay
The goal of sgolay is to offer efficient and vectorized Savitzky-Golay filters.
Installation
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")
Benchmark
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