scipy.signal.

sosfiltfilt#

scipy.signal.sosfiltfilt(sos, x, ось=-1, padtype='odd', padlen=None)[источник]#

Прямо-обратный цифровой фильтр с использованием каскадных секций второго порядка.

См. filtfilt для более полной информации об этом методе.

Параметры:
sosarray_like

Массив коэффициентов фильтра второго порядка, должен иметь форму (n_sections, 6). Каждая строка соответствует звеньям второго порядка, с первыми тремя столбцами, предоставляющими коэффициенты числителя, и последними тремя — коэффициенты знаменателя.

xarray_like

Массив данных для фильтрации.

осьint, необязательный

Ось x к которому применяется фильтр. По умолчанию -1.

padtypestr или None, опционально

Должно быть ‘odd’, ‘even’, ‘constant’ или None. Это определяет тип расширения для дополненного сигнала, к которому применяется фильтр. Если padtype равно None, заполнение не используется. По умолчанию 'odd'.

padlenint или None, опционально

Количество элементов, на которое нужно расширить x на обоих концах ось перед применением фильтра. Это значение должно быть меньше x.shape[axis] - 1. padlen=0 подразумевает отсутствие заполнения. Значение по умолчанию:

3 * (2 * len(sos) + 1 - min((sos[:, 2] == 0).sum(),
                            (sos[:, 5] == 0).sum()))

Дополнительное вычитание в конце пытается компенсировать полюсы и нули в начале координат (например, для фильтров нечетного порядка), чтобы получить эквивалентные оценки padlen к тем из filtfilt для фильтров второго порядка, построенных с помощью scipy.signal функций.

Возвращает:
yndarray

Отфильтрованный вывод с той же формой, что и x.

Смотрите также

filtfilt, sosfilt, sosfilt_zi, freqz_sos

Примечания

Добавлено в версии 0.18.0.

Примеры

>>> import numpy as np
>>> from scipy.signal import sosfiltfilt, butter
>>> import matplotlib.pyplot as plt
>>> rng = np.random.default_rng()

Создать интересный сигнал для фильтрации.

>>> n = 201
>>> t = np.linspace(0, 1, n)
>>> x = 1 + (t < 0.5) - 0.25*t**2 + 0.05*rng.standard_normal(n)

Создайте фильтр Баттерворта нижних частот и используйте его для фильтрации x.

>>> sos = butter(4, 0.125, output='sos')
>>> y = sosfiltfilt(sos, x)

Для сравнения примените фильтр 8-го порядка, используя sosfilt. Фильтр инициализируется с использованием среднего значения первых четырёх значений x.

>>> from scipy.signal import sosfilt, sosfilt_zi
>>> sos8 = butter(8, 0.125, output='sos')
>>> zi = x[:4].mean() * sosfilt_zi(sos8)
>>> y2, zo = sosfilt(sos8, x, zi=zi)

Построить график результатов. Обратите внимание, что фаза y соответствует входным данным, в то время как y2 имеет значительную фазовую задержку.

>>> plt.plot(t, x, alpha=0.5, label='x(t)')
>>> plt.plot(t, y, label='y(t)')
>>> plt.plot(t, y2, label='y2(t)')
>>> plt.legend(framealpha=1, shadow=True)
>>> plt.grid(alpha=0.25)
>>> plt.xlabel('t')
>>> plt.show()
../../_images/scipy-signal-sosfiltfilt-1.png