sosfilt#
- scipy.signal.sosfilt(sos, x, ось=-1, zi=None)[источник]#
Фильтрация данных вдоль одного измерения с использованием каскадных секций второго порядка.
Отфильтруйте последовательность данных, x, используя цифровой IIR-фильтр, определённый sos.
- Параметры:
- sosarray_like
Массив коэффициентов фильтра второго порядка, должен иметь форму
(n_sections, 6). Каждая строка соответствует звеньям второго порядка, с первыми тремя столбцами, предоставляющими коэффициенты числителя, и последними тремя — коэффициенты знаменателя.- xarray_like
Входной массив N-мерности.
- осьint, необязательный
Ось входного массива данных, вдоль которой применяется линейный фильтр. Фильтр применяется к каждому подмассиву вдоль этой оси. По умолчанию -1.
- ziarray_like, необязательный
Начальные условия для задержек каскадного фильтра. Это (как минимум 2D) вектор формы
(n_sections, ..., 2, ...), где..., 2, ...обозначает форму x, но сx.shape[axis]заменяется на 2. Если zi is None или не задано, то предполагается начальное состояние покоя (т.е. все нули). Обратите внимание, что эти начальные условия не такой же, как начальные условия, заданныеlfilticилиlfilter_zi.
- Возвращает:
- yndarray
Выход цифрового фильтра.
- zfndarray, необязательно
Если zi равно None, это не возвращается, в противном случае, zf содержит окончательные значения задержки фильтра.
Смотрите также
Примечания
Функция фильтра реализована как последовательность фильтров второго порядка с транспонированной структурой прямой формы II. Она разработана для минимизации ошибок численной точности для фильтров высокого порядка.
Добавлено в версии 0.16.0.
Примеры
Построить импульсную характеристику фильтра 13-го порядка, используя оба
lfilterиsosfilt, демонстрируя нестабильность, возникающую при попытке создать фильтр 13-го порядка в одной ступени (численная ошибка выталкивает некоторые полюсы за пределы единичной окружности):>>> import matplotlib.pyplot as plt >>> from scipy import signal >>> b, a = signal.ellip(13, 0.009, 80, 0.05, output='ba') >>> sos = signal.ellip(13, 0.009, 80, 0.05, output='sos') >>> x = signal.unit_impulse(700) >>> y_tf = signal.lfilter(b, a, x) >>> y_sos = signal.sosfilt(sos, x) >>> plt.plot(y_tf, 'r', label='TF') >>> plt.plot(y_sos, 'k', label='SOS') >>> plt.legend(loc='best') >>> plt.show()