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.
- Почему я получаю строки нулей в 2D 2D?
- fir2 от matlab до python
- Nump fft freezes для более длинных образцов
- Пакет Python для обработки сигналов
- Невозможно найти правильную энергию, используя scipy.signal.welch
Фильтр 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)
- Как обнаружить щелчок мышью на изображениях, отображаемых в графическом интерфейсе, созданных с помощью PySide
- скрученные отложенные / обратные вызовы и асинхронное выполнение
- частотный анализ с неравномерно распределенными данными в python
- Сглаживание серии взвешенных значений в numpy / pandas
- Отображение бина Python scipy.fftpack.rfft
- Фундаментальная частота по методу Кепстрала
- Записанный звук одной заметки создает несколько периодов начала
- симулятор реалистичного сигнала ЭКГ из данных rr для matlab или python
- 2D круговая свертка Vs свертки FFT
- Подсчет точек данных в пределах и применение буфера к изолированным точкам
- Вычисление DCT с помощью OpenCV