Pregunta

Estoy buscando código / biblioteca / clase de filtro de paso bajo digital para un proyecto de formularios de Windows .net, preferiblemente escrito en c, c ++ o c #. Probablemente necesito establecer el número de polos, coeficientes, ventanas, ese tipo de cosas. No puedo usar ninguno de los códigos gpl'd que están disponibles, y no sé qué más hay disponible. Cualquier sugerencia apreciada.

¿Fue útil?

Solución

Aquí hay un filtro Butterworth Low Pass que escribí para un proyecto reciente.

Tiene algunos números mágicos como constantes que me dieron. Si puede descubrir cómo crear los números mágicos con sus polos, coeficientes, etc., esto podría 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

Otros consejos

Ok, descubrí cómo obtener los coeficientes que usaste. Descargué Octave para Windows y ejecuté el comando de mantequilla (como en MatLab) así:

[b, a] = mantequilla (3, .4, 'baja')

Ahora puedo usar este código con otros parámetros fs y fc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top