2008-12-05 119 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參數。