Все -
Я пытаюсь использовать функцию 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.