2008-12-05 124 views
3

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

回答

19

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

它有一些神奇的数字作为常数给我。如果你能弄清楚如何用你的极点,系数等来创建幻数,那么这可能会有所帮助。

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

} 
} 

基思

+0

谢谢,这正是我所需要的。但我需要fc = 4hz,fs = 20hz的系数,并且无法找到表格或计算器。 – 2008-12-05 17:24:25

+0

你看过这里吗? http://en.wikipedia.org/wiki/Butterworth_filter – 2008-12-05 21:16:10

3

好吧,我发现了如何让你使用的系数。我下载八度窗户和跑黄油命令(如在MatLab中)是这样的:

并[b,A] =黄油(3,0.4,“低”)

现在我可以使用此代码与其他fs和fc参数。