Signal Processing

Проектирование фильтров Баттерворта с помощью SciPy.signal.butter

Spread the love

Библиотека SciPy — мощный инструмент для научных вычислений, а её модуль scipy.signal предоставляет всесторонние средства для обработки сигналов. Фильтрация является фундаментальным аспектом обработки сигналов, и фильтры Баттерворта часто используются из-за их максимально плоской амплитудно-частотной характеристики в полосе пропускания. В этой статье рассматривается функция scipy.signal.butter, ключевой инструмент для проектирования этих фильтров в SciPy.

Содержание

Понимание фильтров Баттерворта

Фильтры Баттерворта ценятся за их максимально плоскую амплитудно-частотную характеристику в полосе пропускания. Эта особенность обеспечивает минимальные искажения сигнала в желаемом диапазоне частот. Однако эта плоскостность достигается за счет относительно плавного спада в полосе задерживания (диапазон частот, где фильтр ослабляет сигнал). Для достижения более крутого спада требуется более высокий порядок фильтра.

Использование 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 улучшает понимание и позволяет проводить анализ производительности.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *