我的原始信號圖如下。如何在Java中實現Chebyshev Type 2 LPF?
我打算做的是做「真正的高峯」檢測。那就是不應該對原始信號中鋸齒狀的噪聲峯值進行計數。
在Python中實現的切比雪夫2型LPF後,信號被平滑到下圖中。
可以看出,我可以在Python中實現LPF。
但我的問題是在Java中實現它。
有沒有適合我的目的的隨便打造的LPF? 或者任何人都可以教我如何在Java中做到這一點?
的參數如下:
截止頻率。 = 4Hz。 採樣率= 350Hz。
我的原始信號圖如下。如何在Java中實現Chebyshev Type 2 LPF?
我打算做的是做「真正的高峯」檢測。那就是不應該對原始信號中鋸齒狀的噪聲峯值進行計數。
在Python中實現的切比雪夫2型LPF後,信號被平滑到下圖中。
可以看出,我可以在Python中實現LPF。
但我的問題是在Java中實現它。
有沒有適合我的目的的隨便打造的LPF? 或者任何人都可以教我如何在Java中做到這一點?
的參數如下:
截止頻率。 = 4Hz。 採樣率= 350Hz。
有很多方法可以實現這樣的過濾器。 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()即可。您可以獲取輸出或新陣列中的輸出。
有關DF I和低階濾波器(二階)的一些工作代碼的更多信息,請訪問:http://blog.bjornroche.com/2012/08/basic-audio-eqs.html代碼位於C但它非常接近Java。 –
我不知道有任何代碼可以做到這一點在Java(這並不是說它不存在),但你已經有在python中設計的過濾器,所以爲什麼不使用你退出設計的係數? –
@BjornRoche是的,真的,我可以回收參數。但確定參數是最簡單的部分......難點在於其他部分。 –
怎麼樣?過濾器的順序是什麼? (你沒有在你的問題中指定) –