2013-06-02 31 views
0

我的原始信號圖如下。如何在Java中實現Chebyshev Type 2 LPF?

我打算做的是做「真正的高峯」檢測。那就是不應該對原始信號中鋸齒狀的噪聲峯值進行計數。 enter image description here

在Python中實現的切比雪夫2型LPF後,信號被平滑到下圖中。 enter image description here

可以看出,我可以在Python中實現LPF。

但我的問題是在Java中實現它。

有沒有適合我的目的的隨便打造的LPF? 或者任何人都可以教我如何在Java中做到這一點?

的參數如下:

截止頻率。 = 4Hz。 採樣率= 350Hz。

+0

我不知道有任何代碼可以做到這一點在Java(這並不是說它不存在),但你已經有在python中設計的過濾器,所以爲什麼不使用你退出設計的係數? –

+0

@BjornRoche是的,真的,我可以回收參數。但確定參數是最簡單的部分......難點在於其他部分。 –

+0

怎麼樣?過濾器的順序是什麼? (你沒有在你的問題中指定) –

回答

1

有很多方法可以實現這樣的過濾器。 Direct Form I既簡單又數字穩定,所以我會推薦。爲了確保準確性,我將顯示遞歸變量的雙精度數字。您可能想要全面使用雙打來避免轉換,但我會以float和double的形式顯示,以便您可以看到您真正需要雙打的位置。

我沒有這樣的高階過濾器,所以這是未經測試的代碼,但這裏的概念和上面的鏈接將爲您解答。您可以隨時將您的結果與python結果進行比較。

首先,你應該已經有以下形式的係數:

float a[10] = { ... } 
float b[10] = { ... } 

現在,你要確保係數進行歸一化,如果它們已經不:

for(int i=0; i<10; ++i) 
    b[i] /= a[0]; 
for(int i=1; i<10; ++i) 
    a[i] /= a[0]; 

你最後的設置步驟將創建你的內存緩衝區來存儲舊的輸入(x)和輸出(y):

float x[10] = { 0, 0, 0, ... } 
double y[10] = { 0, 0, 0, ... } 

當「重新設置」新數據集的過濾器時,請記住將它們的值再次設置爲0。

現在您已準備好開始處理。這涉及兩個步驟:1.計算您的輸出,並2.更新您的存儲值。

float processOneValue(float in) { 
    // calculate new output: 
    double out = in * b[0] ; 
    for(int i=0; i<9; ++i) 
     out += x[i]*b[i+1] ; 
    for(int i=0; i<9; ++i) 
     out -= y[i]*a[i+1] ; 

    // update: 
    for(int i=9; i>=1; --i) 
     y[i] = y[i-1]; 
    y[0] = out; 

    for(int i=9; i>=1; --i) 
     x[i] = x[i-1]; 
    x[0] = in; 

    return out; 
} 

由於這是一個高階濾波器,它可能是更有效地使用一個ringbuffer,而不是我用x和y的「戽鏈」式的更新,但這個工程,是簡單的閱讀。

現在,要處理一個數組數組,只需循環processOneValue()即可。您可以獲取輸出或新陣列中的輸出。

+1

有關DF I和低階濾波器(二階)的一些工作代碼的更多信息,請訪問:http://blog.bjornroche.com/2012/08/basic-audio-eqs.html代碼位於C但它非常接近Java。 –