# C# Savitzky Golay Filtering Example

← All NMath Code Examples

```using System;
using System.Globalization;

using CenterSpace.NMath.Core;

namespace CenterSpace.NMath.Examples.CSharp
{
/// <summary>
/// A .NET example in C# showing how to use the Savitzky-Golay filtering class.
/// </summary>
class SavitzkyGolayFilteringExample
{

static void Main( string[] args )
{
#region Savitzky-Golay Smoothing

// Build a Savitzky-Golay filter with a window width of 7, and a 4th degree smoothing polynomial.
var sgf = new SavitzkyGolayFilter( 3, 3, 4 );

// Make some random noise.
RandomNumberGenerator rnd = new RandGenUniform();
var data = new DoubleVector( 100, rnd );

// Build a noisy sinusoidal signal to filter.
double step_size = 0.1;
var x = new DoubleVector( 100, 0, step_size );
var sin_x = new DoubleVector( NMathFunctions.Sin( x ) + data.Scale( 0.1 ) );

// Filter the signal function
DoubleVector z = sgf.Filter( sin_x );

#endregion

#region Savitzky-Golay Derivatives

// Build a vector of a sampled sinc() function and its derivative.
x = new DoubleVector( 100, 0.01, step_size );
var sinc = new DoubleVector( NMathFunctions.Sin( x ) / x );
var derivative_sinc = new DoubleVector( NMathFunctions.Cos( x ) / x - NMathFunctions.Sin( x ) / ( x * x ) );

// Create a Savitzky-Golay filter for computing the first derivative using a 5th degree polynomial.
// By default the boundaries are smoothed to the edges, if this is not necessary,
// other faster boundary handling options are available.
sgf = new SavitzkyGolayFilter( 3, 3, 5, 1 );

// Find the S-G derivatives.
DoubleVector sg_d_sinc = sgf.Filter( sinc );

// Scale the raw derivatives.
sgf.ScaleDerivative( step_size, ref sg_d_sinc );

// Look at the mean squared error over the 100 samples, of the SG derivatives.
Double mean_sqrd_error = NMathFunctions.Mean( NMathFunctions.Pow( derivative_sinc - sg_d_sinc, 2.0 ) );

Console.WriteLine();

Console.WriteLine( "The mean squared error of the Savitzky-Golay derivative estimate of the sinc() function = {0}", mean_sqrd_error );

#endregion

Console.WriteLine();
Console.WriteLine( "Press Enter Key" );