In 1964, A. Savitsky and M.J.E. Golay published an article in Analytical Chemistry describing a simple and effective smoothing technique: “Smoothing and Differentiation of Data by Simplified Least Squares Procedures”.
Their method makes it possible to smooth or derive a time series, with equidistant abscissa values, by a simple convolution with a series of coefficients corresponding to the degree of the chosen polynomial interpolation and to the desired operation: simple smoothing or derivation up to 5th order.
The convolution is performed by n multiplications, followed by the sum of the products and completed by dividing by the corresponding norm. The coefficients and norms are provided in the article. Savitzky and Golay's article is accompanied by 11 tables of coefficients suitable for smoothing or determining of the first 5 derivatives; convolutions are performed for different degrees of polynomials and over ranges from 5 to 25 points. The tables published by Savitzky and Golay contain different typo errors. They were corrected by J. Steiner, Y. Termonia and J. Deltour in 1972.
I really like this filter, as it preserves signal dynamics and effectively filters out background noise. We've used this technique a lot in recent years at R2P2 (https://uniter2p2.fr) to process videos (of babies) who were shaking. This prevented our neural networks from correctly identifying the baby's body joints. With this type of filter, everything is back to normal. The video images did not shake and the detection algorithms became perfect (see Taleb, A., Rambaud, P., Diop, S., Fauches, R., Tomasik, J., Jouen, F., Bergounioux, J. "Spinal Muscular Amyotrophy detection using computer vision and artificial intelligence." in JAMA Pediatrics, Published online March 4, 2024.).
The main advantage of this process is that it's rather easy to program, allowing direct access to derivative values. On the other hand, abscissa values must be equidistant, and extreme points are ignored.
You can find the filter code for Red:
(https://github.com/ldci/redCV/blob/master/samples/signal_processing/sgFilter.red)
And for Rebol 3 here:
https://github.com/ldci/R3_tests/blob/main/signalProcessing/sgFilter.r3
A. Savitzky, M.J.E. Golay, ANAL. CHEM., 36,1627 (1964)
J. Steiner, Y. Termonia, J. Deltour, ANAL. CHEM., 44,1909 (1972)