1st order filter

main
syneffort 11 months ago
parent a6abc17228
commit a56e1eb1b4
  1. 34
      OxyPlotExample/GettingStarted/Filter/HighPassFilter.cs
  2. 13
      OxyPlotExample/GettingStarted/Filter/IFilter.cs
  3. 31
      OxyPlotExample/GettingStarted/Filter/LowPassFilter.cs
  4. 18
      OxyPlotExample/GettingStarted/ViewModels/MainViewModel3.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;
}
}
}

@ -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);
}
}

@ -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;
}
}
}

@ -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)
{

Loading…
Cancel
Save