Библиотека SciPy — мощный инструмент для научных вычислений, а её модуль scipy.signal
предоставляет всесторонние средства для обработки сигналов. Фильтрация является фундаментальным аспектом обработки сигналов, и фильтры Баттерворта часто используются из-за их максимально плоской амплитудно-частотной характеристики в полосе пропускания. В этой статье рассматривается функция scipy.signal.butter
, ключевой инструмент для проектирования этих фильтров в SciPy.
Содержание
- Понимание фильтров Баттерворта
- Использование
scipy.signal.butter
- Пример: проектирование нижнепропускного фильтра Баттерворта
- Пример: применение фильтра и визуализация
- Заключение
Понимание фильтров Баттерворта
Фильтры Баттерворта ценятся за их максимально плоскую амплитудно-частотную характеристику в полосе пропускания. Эта особенность обеспечивает минимальные искажения сигнала в желаемом диапазоне частот. Однако эта плоскостность достигается за счет относительно плавного спада в полосе задерживания (диапазон частот, где фильтр ослабляет сигнал). Для достижения более крутого спада требуется более высокий порядок фильтра.
Использование scipy.signal.butter
Функция scipy.signal.butter
является основным инструментом для проектирования фильтров Баттерворта в SciPy. Её ключевые параметры:
N
: Порядок фильтра. Более высокие порядки обеспечивают более крутой спад, но увеличивают сложность и потенциальную нестабильность.Wn
: Частота среза (или частоты для полосовых и заграждающих фильтров), нормированная к частоте Найквиста (половина частоты дискретизации). Значение 0,5 соответствует половине частоты дискретизации.btype
: Тип фильтра: ‘lowpass’, ‘highpass’, ‘bandpass’ или ‘bandstop’.analog
:True
проектирует аналоговый фильтр;False
(по умолчанию) проектирует цифровой фильтр.output
: Указывает формат вывода. ‘ba’ (коэффициенты числителя и знаменателя) и ‘sos’ (каскад второго порядка) являются распространенными вариантами. ‘sos’ обычно предпочтительнее для численной устойчивости, особенно для фильтров высокого порядка.
Пример: проектирование нижнепропускного фильтра Баттерворта
Давайте спроектируем нижнепропускной фильтр Баттерворта 4-го порядка с частотой среза 10 Гц, предполагая частоту дискретизации 100 Гц:
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# Частота дискретизации
fs = 100 # Гц
# Частота среза (нормированная)
cutoff = 10 / (fs / 2) # Нормализация к частоте Найквиста
# Порядок фильтра
order = 4
# Проектирование фильтра с использованием SOS для устойчивости
sos = signal.butter(order, cutoff, btype='lowpass', analog=False, output='sos')
#Вывод SOS
print("Каскад второго порядка (sos):", sos)
Пример: применение фильтра и визуализация
Чтобы применить фильтр и визуализировать результаты:
# Пример сигнала
t = np.linspace(0, 1, fs, endpoint=False)
sig = np.sin(2 * np.pi * 20 * t) + np.sin(2 * np.pi * 5 * t)
# Применение фильтра
filtered_sig = signal.sosfilt(sos, sig)
# Построение графика исходного и отфильтрованного сигналов
plt.figure(figsize=(10, 6))
plt.plot(t, sig, label='Исходный сигнал')
plt.plot(t, filtered_sig, label='Отфильтрованный сигнал')
plt.xlabel('Время (с)')
plt.ylabel('Амплитуда')
plt.title('Исходный и отфильтрованный сигналы')
plt.legend()
plt.grid(True)
plt.show()
Заключение
scipy.signal.butter
— мощный инструмент для проектирования фильтров Баттерворта. Понимание его параметров и использование вывода ‘sos’ для численной устойчивости имеют решающее значение для эффективного проектирования фильтров в ваших рабочих процессах обработки сигналов. Не забывайте нормировать частоты среза к частоте Найквиста. Визуализация частотных характеристик фильтра с помощью Matplotlib улучшает понимание и позволяет проводить анализ производительности.