SciPy "lfilter" возвращает только NaNs

Все –

Я пытаюсь использовать функцию signal.lfilter SciPy для фильтрации вектора выборок – к сожалению, все, что возвращается, является вектором NaN .

Я построил частотную характеристику фильтра, и коэффициенты фильтра выглядят правильно; Я довольно уверен, что проблема lfilter с фактическим вызовом lfilter .

Это фильтр высоких частот Чебычева I, который я создаю с помощью:

 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 возвращать только NaN? Как я использую эту функцию неправильно?

Заранее спасибо за вашу помощь!

Редактировать:

Хорошо, я решил.

Для тех, кто сталкивается с этим в будущем:

По какой-то причине, несмотря на то, что возвращаемые коэффициенты для фильтра выглядели хорошо, когда я использовал эти коэффициенты в lfilter функции SciPy, отфильтрованные значения были неограниченными. Простое изменение края полосы пропускания на ЛЮБОЕ число, отличное от 0.11 устранило проблему. Даже это работает:

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

Помимо ручного grepping через полюсы и нули фильтра, я не уверен, как вы обнаружите нестабильность фильтра. Bizarre.

Фильтр IIR стабилен, если абсолютные значения корней знаменателя дискретной передаточной функции a (z) все меньше единицы. Таким образом, вы можете обнаружить нестабильность по следующему коду:

 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)