2012-01-10 25 views
4

全部 -SciPy的「lfilter」只返回NaN的

我想使用SciPy的的signal.lfilter功能來篩選樣品的載體 - 不幸的是,所有的返回是的NaN的載體。

我已經繪製了濾波器的頻率響應,濾波器係數看起來是正確的;我很確定問題出在lfilter的實際呼叫。

這是一個高通切比雪夫我濾波器,我與創造:

b,a = signal.iirdesign(wp = 0.11, ws= 0.1, gstop= 60, gpass=1, ftype='cheby1') 

我然後用過濾數據:

filtered_data = signal.lfilter(b, a, data) 

下面,我打印選擇20來自預過濾的數據的樣本,然後是經過濾的數據。你可以清楚地看到問題:

### Printing a small selection of the data before it is filtered: 

((-0.003070347011089325+0.0073614344000816345j), (-0.003162827342748642+0.007342938333749771j), (-0.003310795873403549+0.0073614344000816345j), (-0.0031813234090805054+0.007342938333749771j), (-0.003255307674407959+0.007398426532745361j), (-0.003162827342748642+0.007287450134754181j), (-0.003125835210084915+0.007509402930736542j), (-0.003162827342748642+0.007342938333749771j), (-0.0031073391437530518+0.007287450134754181j), (-0.0032368116080760956+0.007398426532745361j), (-0.0030888430774211884+0.007342938333749771j)) 


### Printing a small selection of the filtered data: 

[ nan nanj nan nanj nan nanj nan nanj nan nanj nan nanj nan nanj 
    nan nanj nan nanj nan nanj nan nanj nan nanj nan nanj nan nanj 
    nan nanj nan nanj nan nanj nan nanj nan nanj nan nanj] 

就像我之前說過的,濾波器的係數看起來不錯。它們是:

b = [ 4.06886235e-02 -7.73083846e-01 6.95775461e+00 -3.94272761e+01 
    1.57709105e+02 -4.73127314e+02 1.10396373e+03 -2.05021836e+03 
    3.07532754e+03 -3.75873366e+03 3.75873366e+03 -3.07532754e+03 
    2.05021836e+03 -1.10396373e+03 4.73127314e+02 -1.57709105e+02 
    3.94272761e+01 -6.95775461e+00 7.73083846e-01 -4.06886235e-02] 
a = [ 1.00000000e+00 -1.27730099e+01 7.81201390e+01 -3.03738394e+02 
    8.40827723e+02 -1.75902089e+03 2.88045462e+03 -3.77173152e+03 
    3.99609428e+03 -3.43732844e+03 2.38415171e+03 -1.30118368e+03 
    5.21654119e+02 -1.18026566e+02 -1.85597824e+01 3.24205235e+01 
    -1.65545917e+01 5.02665439e+00 -9.09697811e-01 7.68172820e-02] 

那麼,爲什麼lfilter只返回喃?我如何錯誤地使用這個功能?

在此先感謝您的幫助!

編輯:

好吧,我解決了這個問題。

對於任何人遇到這種在未來:

無論出於何種原因,即使對過濾器的返回係數看起來很不錯,當我再用於SciPy的的lfilter函數的係數,過濾後的值是無界的。只需將通帶邊緣更改爲ANY號碼除0.11以外的問題修復。即使這個工程:

b,a = signal.iirdesign(wp = 0.119, ws= 0.1, gstop= 60, gpass=1, ftype='cheby1') 

除了手動刷新過濾器的極點和零,我不知道你將如何檢測過濾器的不穩定性。離奇。

回答

8

如果離散傳遞函數a(z)的分母的根的絕對值都小於1,那麼IIR濾波器是穩定的。因此,您可以通過以下代碼檢測不穩定性:

from scipy import signal 
import numpy as np 
b1, a1 = signal.iirdesign(wp = 0.11, ws= 0.1, gstop= 60, gpass=1, ftype='cheby1') 
b2, a2 = signal.iirdesign(wp = 0.119, ws= 0.1, gstop= 60, gpass=1, ftype='cheby1') 

print "filter1", np.all(np.abs(np.roots(a1))<1) 
print "filter2", np.all(np.abs(np.roots(a2))<1) 
+0

兩個過濾器都返回「True」。爲什麼這說明第一個不起作用? – PatriceG 2015-12-15 08:52:33

+0

@ sandoval31對於我來說,第一個輸出是False,而第二個輸出是True? – robintibor 2016-03-17 18:53:12