diff --git a/OxyPlotExample/GettingStarted/Filter/HighPassFilter.cs b/OxyPlotExample/GettingStarted/Filter/HighPassFilter.cs new file mode 100644 index 0000000..6d43bed --- /dev/null +++ b/OxyPlotExample/GettingStarted/Filter/HighPassFilter.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GettingStarted.Filter +{ + class HighPassFilter : IFilter + { + private double _alpha; + private double _previousOutput; + private double _previouseInput; + + public HighPassFilter(double alpha) + { + if (alpha < 0.0 || alpha > 1.0) + throw new ArgumentException(nameof(alpha), "Alpha must be between 0 and 1."); + + _alpha = alpha; + _previousOutput = 0.0; + _previouseInput = 0.0; + } + + public double Filter(double input) + { + double output = _alpha * (_previousOutput + input - _previouseInput); + _previousOutput = output; + _previouseInput = input; + + return output; + } + } +} diff --git a/OxyPlotExample/GettingStarted/Filter/IFilter.cs b/OxyPlotExample/GettingStarted/Filter/IFilter.cs new file mode 100644 index 0000000..d5c98fd --- /dev/null +++ b/OxyPlotExample/GettingStarted/Filter/IFilter.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GettingStarted.Filter +{ + interface IFilter + { + public double Filter(double value); + } +} diff --git a/OxyPlotExample/GettingStarted/Filter/LowPassFilter.cs b/OxyPlotExample/GettingStarted/Filter/LowPassFilter.cs new file mode 100644 index 0000000..40c0fd5 --- /dev/null +++ b/OxyPlotExample/GettingStarted/Filter/LowPassFilter.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GettingStarted.Filter +{ + class LowPassFilter : IFilter + { + private double _alpha; + private double _previousOutput; + + public LowPassFilter(double alpha) + { + if (alpha < 0.0 || alpha > 1.0) + throw new ArgumentException(nameof(alpha), "Alpha must be between 0 and 1."); + + _alpha = alpha; + _previousOutput = 0.0; + } + + public double Filter(double input) + { + double output = _previousOutput + _alpha * (input - _previousOutput); + _previousOutput = output; + + return output; + } + } +} diff --git a/OxyPlotExample/GettingStarted/ViewModels/MainViewModel3.cs b/OxyPlotExample/GettingStarted/ViewModels/MainViewModel3.cs index e66318c..d590c20 100644 --- a/OxyPlotExample/GettingStarted/ViewModels/MainViewModel3.cs +++ b/OxyPlotExample/GettingStarted/ViewModels/MainViewModel3.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using System.Timers; using System.Windows; using OxyPlot.Axes; +using GettingStarted.Filter; namespace GettingStarted.ViewModels { @@ -24,14 +25,22 @@ namespace GettingStarted.ViewModels [ObservableProperty] - private double _cutOffSecond; + private LineSeries _lpfSeries; + + + [ObservableProperty] + private double _cutOffSecond; + private IFilter _filter; public MainViewModel3() { MyModel = new PlotModel() { Title = "Getting Started with RT Plot", PlotMargins = new OxyThickness(50, 10, 50, 50) }; LineSeries = new LineSeries() { Title = "Dynamic Data" }; + LpfSeries = new LineSeries() { Title = "Filtered" }; + + _filter = new HighPassFilter(0.5); DateTimeAxis timeAxis = new DateTimeAxis() { @@ -53,6 +62,7 @@ namespace GettingStarted.ViewModels MyModel.Axes.Add(linearAxis); MyModel.Series.Add(LineSeries); + MyModel.Series.Add(LpfSeries); CutOffSecond = 10d; @@ -72,11 +82,13 @@ namespace GettingStarted.ViewModels DateTime now = DateTime.Now; double noise = (_rand.NextDouble() - 0.5) * _noiseLevel; - //LineSeries.Points.Add(new DataPoint(_lastX, Math.Sin(_lastX * 0.1) + noise)); - LineSeries.Points.Add(new DataPoint(DateTimeAxis.ToDouble(DateTime.Now), Math.Sin(_lastX * 0.1) + noise)); + double value = Math.Sin(_lastX * 0.1) + noise; + LineSeries.Points.Add(new DataPoint(DateTimeAxis.ToDouble(DateTime.Now), value)); + LpfSeries.Points.Add(new DataPoint(DateTimeAxis.ToDouble(DateTime.Now), _filter.Filter(value))); DateTime cutOff = now.AddSeconds(-1 * CutOffSecond); LineSeries.Points.RemoveAll(d => DateTimeAxis.ToDateTime(d.X) < cutOff); + LpfSeries.Points.RemoveAll(d => DateTimeAxis.ToDateTime(d.X) < cutOff); if (MyModel.Axes[0] is DateTimeAxis timeAxis) {