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.
Смотрите также
Примечания
Добавлено в версии 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()