Tiefpassfilter-Software?
-
19-08-2019 - |
Frage
Ich suche nach digitalen Tiefpassfilter Code / library / Klasse für eine .net Windows Forms-Projekt, vorzugsweise in c geschrieben, C ++ oder C #. Ich brauche wohl die Anzahl der Pole, Koeffizienten, Windowing zu setzen, diese Art der Sache. Ich kann nicht des GPL-Code verwenden, die verfügbar ist, und weiß nicht, was es sonst noch gibt. Irgendwelche Vorschläge geschätzt.
Lösung
Hier ist ein Butterworth-Tiefpassfilter ich für ein aktuelles Projekt geschrieben.
Es hat einige magische Zahlen als Konstanten, die mir gegeben wurde. Wenn Sie herausfinden, wie die magischen Zahlen mit Polen zu schaffen, Koeffizienten, etc, dann könnte dies hilfreich sein.
using System;
using System.Collections.Generic;
using System.Text;
namespace Filter
{
public class ButterworthLowPassFilter
{
//filter fc = 2hz, fs = 10hz
private const int LowPassOrder = 4;
private double[] inputValueModifier;
private double[] outputValueModifier;
private double[] inputValue;
private double[] outputValue;
private int valuePosition;
public ButterworthLowPassFilter()
{
inputValueModifier = new double[LowPassOrder];
inputValueModifier[0] = 0.098531160923927;
inputValueModifier[1] = 0.295593482771781;
inputValueModifier[2] = 0.295593482771781;
inputValueModifier[3] = 0.098531160923927;
outputValueModifier = new double[LowPassOrder];
outputValueModifier[0] = 1.0;
outputValueModifier[1] = -0.577240524806303;
outputValueModifier[2] = 0.421787048689562;
outputValueModifier[3] = -0.0562972364918427;
}
public double Filter(double inputValue)
{
if (this.inputValue == null && this.outputValue == null)
{
this.inputValue = new double[LowPassOrder];
this.outputValue = new double[LowPassOrder];
valuePosition = -1;
for (int i=0; i < LowPassOrder; i++)
{
this.inputValue[i] = inputValue;
this.outputValue[i] = inputValue;
}
return inputValue;
}
else if (this.inputValue != null && this.outputValue != null)
{
valuePosition = IncrementLowOrderPosition(valuePosition);
this.inputValue[valuePosition] = inputValue;
this.outputValue[valuePosition] = 0;
int j = valuePosition;
for (int i = 0; i < LowPassOrder; i++)
{
this.outputValue[valuePosition] += inputValueModifier[i] * this.inputValue[j] -
outputValueModifier[i] * this.outputValue[j];
j = DecrementLowOrderPosition(j);
}
return this.outputValue[valuePosition];
}
else
{
throw new Exception("Both inputValue and outputValue should either be null or not null. This should never be thrown.");
}
}
private int DecrementLowOrderPosition(int j)
{
if (--j < 0)
{
j += LowPassOrder;
}
return j;
}
private int IncrementLowOrderPosition(int position)
{
return ((position + 1) % LowPassOrder);
}
}
}
Keith
Andere Tipps
Ok, habe ich herausgefunden, wie die Koeffizienten zu erhalten, die Sie verwenden. Ich heruntergeladen Octave für Fenster und lief die Butter-Befehl (wie in Matlab) wie folgt aus:
[b, a] = Butter (3, 0,4, 'low')
Jetzt kann ich diesen Code mit anderen fs und fc Parametern verwenden.