低通滤波器软件? [英] Low pass filter software?

查看:150
本文介绍了低通滤波器软件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找一个.net windows窗体项目的数字低通滤波器代码/库/类,最好用c,c ++或c#编写。我可能需要设置极点数,系数,窗口等等。我不能使用任何可用的gpl'd代码,也不知道还有什么。任何建议感激。

解决方案

这是我为近期项目编写的巴特沃斯低通滤波器。

它有一些神奇的数字作为给我的常量。如果你能想出如何用你的极点,系数等来创建幻数,那么这可能是有用的。

 使用系统; 
using System.Collections.Generic;
使用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 =减少LowOrderPosition(j);
}

return this.outputValue [valuePosition];
}
else
{
抛出新的异常(inputValue和outputValue都应该为null或不为null,永远不会抛出。



private int DecrementLowOrderPosition(int j)
{
if( - j <0)
{
j + = LowPassOrder;
}
return j;

$ b private int IncrementLowOrderPosition(int position)
{
return((position +1)%LowPassOrder);





$ b $ Keith


I'm looking for digital low pass filter code/library/class for a .net windows forms project, preferably written in c, c++ or c#. I probably need to set the number of poles, coefficients, windowing, that sort of thing. I can't use any of the gpl'd code that's available, and don't know what else is out there. Any suggestions appreciated.

解决方案

Here is a Butterworth Low Pass filter I wrote for a recent project.

It has some magic numbers as constants that was given to me. If you can figure out how to create the magic numbers with your poles, coefficients, etc, then this might be helpful.

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

这篇关于低通滤波器软件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆