signal-processing - 低通滤波软件?

标签 signal-processing filter

我正在为 .net Windows 窗体项目寻找数字低通滤波器代码/库/类,最好用 c、c++ 或 c# 编写。我可能需要设置极数、系数、开窗之类的东西。我不能使用任何可用的 gpl 代码,也不知道那里还有什么。任何建议表示赞赏。

最佳答案

这是我为最近的项目编写的 Butterworth 低通滤波器。

它有一些神奇的数字作为给我的常量。如果您能弄清楚如何使用您的极点、系数等创建魔数(Magic Number),那么这可能会有所帮助。

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);
    }

}
}

基思

关于signal-processing - 低通滤波软件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/344343/

相关文章:

javascript - 通过删除不需要的嵌套对象属性来过滤对象数组

rest - 如何将对象过滤器与 softlayer rest api 一起使用?

c++ - WebRTC AGC(自动增益控制)

audio - 建立音频信号的功率谱时,为什么需要将窗口函数应用于采样?

matlab - 在 MATLAB 中从信号中提取 EEG 分量

c++ - 在一定秒数内更改缓冲区大小

jQuery Alpabetical 在表格、A、B、C 等列表中按名称过滤

algorithm - 什么是正确的算法...呃,我不知道它叫什么

r - 在 R 中过滤数据帧时排除字符串列中任何多个字符的最佳方法

android - 如何像屏幕过滤器一样降低亮度