signal processing - para - Software de filtro de paso bajo?
filtros en matlab para audio (2)
Este es un filtro Butterworth Low Pass que escribí para un proyecto reciente.
Tiene algunos números mágicos como constantes que se 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
Estoy buscando el código de filtro de paso bajo digital / library / class para un proyecto de formularios .NET Windows, preferiblemente escrito en c, c ++ o c #. Probablemente necesite establecer el número de polos, coeficientes, ventanas, ese tipo de cosas. No puedo usar ninguno de los códigos gpl''d disponibles, y no sé qué más hay disponible. Cualquier sugerencia apreciada.
Ok, descubrí cómo obtener los coeficientes que usaste. Descargué Octave para Windows y ejecuté el comando de la mantequilla (como en MatLab) de esta manera:
[b, a] = mantequilla (3, .4, ''baja'')
Ahora puedo usar este código con otros parámetros fs y fc.