software filtro passa-baixa?
-
19-08-2019 - |
Pergunta
Eu estou procurando digital de baixo código de filtro de passagem / biblioteca / classe para um .net Windows Forms projeto, de preferência por escrito em C, C ++ ou C #. Eu provavelmente precisará definir o número de pólos, coeficientes, janela, esse tipo de coisa. Eu não posso usar qualquer código GPL que está disponível, e não sei o que mais está lá fora. Todas as sugestões apreciado.
Solução
Aqui está um filtro Butterworth Low Pass eu escrevi para um projeto recente.
Tem alguns números mágicos como constantes que me foi dado. Se você pode descobrir como criar os números mágicos com os seus pólos, coeficientes, etc, então este pode ser útil.
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
Outras dicas
Ok, eu descobri como obter os coeficientes que você usou. Eu baixei Octave para janelas e executou o comando manteiga (como em MatLab) como este:
[b, a] = manteiga (3, 0,4, 'baixo')
Agora eu posso usar este código com outros fs e parâmetros fc.