SciPy "lfilter" возвращает только NaNs - PullRequest
5 голосов
/ 11 января 2012

Все -

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

Я построил частотную характеристику фильтра, и коэффициенты фильтра выглядят правильно; Я вполне уверен, что проблема связана с фактическим вызовом 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? Как я неправильно использую эту функцию?

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

Edit:

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

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

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

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

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

1 Ответ

9 голосов
/ 11 января 2012

БИХ-фильтр стабилен, если абсолютные значения корней знаменателя дискретной передаточной функции 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)
...