В приложениях цифровой обработки сигналов(DSP) используется один из двух основных типов цифровых фильтров — БИХ-фильтры (второй тип — КИХ). Бесконечная импульсная характеристика называется «IIR».
Благодаря обратной связи в фильтре импульсная характеристика является «бесконечной», а это означает, что если вы примените импульс(одну выборку «1», за которой следуют несколько выборок «0»), вы получите бесконечное количество ненулевых значений.
БИХ-фильтры используют меньше памяти и вычислений для достижения заданной характеристики фильтрации, чем сопоставимый КИХ-фильтр.
- Функция freqz()
- Фильтр IIR Sos
- Проектирование IIR-фильтра
- Полосовые фильтры
- Коэффициенты фильтра
- Метод iirfilter()
Функция freqz()
В приведенной выше части мы узнали о концепции БИХ-фильтра. В этом разделе мы будем использовать этот метод для создания фильтра, а затем использовать выходные данные для вычисления частотной характеристики цифрового фильтра с помощью функции freqz().
Давайте рассмотрим пример, выполнив следующие шаги:
- Импортируйте необходимые библиотеки, используя приведенный ниже код Python.
import numpy as np from scipy.signal import iirfilter, freqz
- Создайте аналоговый полосовой фильтр Чебышева II 15-го порядка 50–200 Гц, используя приведенный ниже код.
b, a = iirfilter(15, [2*np.pi*50, 2*np.pi*200], rs=50, btype='band', analog=True, ftype='cheby2')
- Теперь вычислите частотную характеристику цифрового фильтра, используя приведенный ниже код.
w, h = freqz(b, a, 1000) print("w = {},h={}".format(w,h))
Фильтр IIR Sos
Чтобы вычислить частотную характеристику цифрового фильтра в формате SOS или вычислить частотную характеристику системной функции с учетом sos, предоставлен массив секций цифрового фильтра второго порядка с формой(n, 6). Модуль Python Scipy scipy.signal имеет метод sosfreqz().
Синтаксис:
scipy.signal.sosfreqz(sos, whole=False, worN=512, fs=6.283185307179586)
Где параметры:
- sos (array_data): требуется массив коэффициентов фильтра второго порядка с формой(n секций, 6). Первые три столбца содержат коэффициенты числителя, а последние три — коэффициенты знаменателя, а каждая строка представляет собой раздел второго порядка.
- whole (логическое значение): частота Найквиста, fs/2, представляет собой стандартный диапазон, на основе которого рассчитываются частоты(верхняя половина единичного круга). Выполните расчет частоты от 0 до fs, если все верно. игнорируется, если работа похожа на массив.
- wordN (int, array, None): Вычислить на таком количестве частот, если имеется только одно целое число(значение N по умолчанию — 512). Это практическая замена: «np.linspace(0, fs if all else fs/2, N, endpoint=include_nyquist)». Можно ускорить вычисления, используя быстрое число для вычислений БПФ. Вычислите ответ на заданных частотах, если данные похожи на массив. Они измеряются в единицах, совместимых с fs.
- fs (float): частота дискретизации системы в цифровой форме. по умолчанию используется значение радианы/выборка при 2*пи(то есть w от 0 до пи).
Давайте рассмотрим пример, выполнив следующие шаги:
- Импортируйте необходимые библиотеки, используя приведенный ниже код Python.
from scipy.signal import ellip, sosfreqz
- Создайте полосовой фильтр 20-го порядка в формате SOS, используя приведенный ниже код.
sos_format = ellip(20, 0.4, 70,(0.3, 0.5), btype='bandpass', output='sos')
- Рассчитайте частотную характеристику между постоянным током и Найквистом в 2000 точках, используя приведенный ниже код.
w, h = sosfreqz(sos_format, worN=2000) print("w = {},h={}".format(w,h))
Проектирование IIR-фильтра
Метод iirdesign() Python Scipy, существующий в модуле scipy.signal, используется для завершения разработки цифровых и аналоговых фильтров БИХ.
Он создает аналоговый или цифровой БИХ-фильтр необходимого минимального порядка для указанного базового типа с учетом частот и коэффициентов усиления полосы пропускания и полосы задерживания. Возвращает результат в форме числителя, знаменателя, полюса-ноля, разделов второго порядка или в форме полюса-ноля(«ба»).
Синтаксис:
scipy.signal.iirdesign(wp, ws, gpass, gstop, analog=False, ftype='ellip', output='ba', fs=None)
Где параметры:
- wp,ws (float): Краевые частоты для полосы задерживания и полосы пропускания. Скаляры(для фильтров нижних и верхних частот) или диапазоны являются потенциальными значениями(для полосовых и заграждающих фильтров). Они выражаются в тех же единицах, что и fs для цифровых фильтров. Выборки нормализуются от 0 до 1, где 1 — частота Найквиста, поскольку по умолчанию fs составляет 2 полупериода на выборку.
- gpass: Максимальные потери полосы пропускания на максимуме(дБ).
- gstop: минимальное затухание полосы задерживания(дБ).
- analog (логическое): Возвращает аналоговый фильтр, если True; в противном случае верните цифровой фильтр.
- ftype (str): Тип создаваемого БИХ-фильтра: cheby1, Butter, cheby2, ellip и bessel.
- output: Форма выходного фильтра: «sos» для разделов второго порядка. Числитель и знаменатель по умолчанию — «ba», а нулевой полюс: «zpk».
- fs (float): частота дискретизации системы в цифровой форме.
Давайте посмотрим на примере, выполнив следующие шаги:
- Импортируйте необходимые библиотеки или методы, используя приведенный ниже код Python.
from scipy.signal import freqz, iirdesign
- Присвойте значения параметрам метода iirdesign(), используя приведенный ниже код.
wp_ = 0.3 ws_ = 0.2 gpass_ = 2 gstop_ = 45
- Создайте проект БИХ-фильтра, используя приведенный ниже код.
system_ = iirdesign(wp_, ws_, gpass_, gstop_) w_, h_ = freqz(*system_) print(w_) print(h_)
Полосовые фильтры
Полосовой фильтр — это электрический компонент или схема, которая различает сигналы на других частотах, позволяя при этом проходить сигналам между двумя назначенными частотами.
Активные полосовые фильтры — это полосовые фильтры, в которых используются активные части, такие как транзисторы и интегральные схемы, которым требуется внешний источник питания. Пассивные полосовые фильтры — это те, которые не требуют внешнего источника питания и полностью состоят из пассивных частей, таких как конденсаторы и катушки индуктивности.
Метод Python Scipy iirfilter() принимает параметр btype для указания типа фильтров, таких как фильтр нижних частот, полосовой фильтр, заграждающий фильтр и фильтр верхних частот.
Здесь, в этом разделе, мы создадим БИХ-фильтр полосового сигнала, выполнив следующие шаги:
- Импортируйте необходимые библиотеки, используя приведенный ниже код Python.
import numpy as np from scipy.signal import iirfilter, freqz
- Используйте приведенный ниже код, чтобы создать аналоговый полосовой фильтр 14-го порядка 30–150 Гц.
b, a = iirfilter(14, [2*np.pi*30, 2*np.pi*150], rs=50, btype='band', analog=True, ftype='cheby2')
В приведенном выше коде параметр btype равен диапазону, что означает полосу пропускания.
- Теперь используйте приведенный ниже код для расчета частотной характеристики цифрового фильтра.
w, h = freqz(b, a, 600) print("w = {},h={}".format(w,h))
Коэффициенты фильтра
Метод Python Scipy iirfilter() принимает выходные параметры для возврата различных типов результатов, таких как «sos» для разделов второго порядка.
Числитель и знаменатель по умолчанию — «ba», а нулевой полюс: «zpk». Итак, здесь, в этом разделе, мы получим значения числителя и знаменателя коэффициентов в качестве вывода, указав вывод = ‘ba’.
Коэффициенты разностного уравнения являются коэффициентами фильтра. Если ваш фильтр является КИХ-фильтром, значения импульсной характеристики являются коэффициентами фильтра. Коэффициенты фильтра и импульсная характеристика не совпадают, если у вас есть БИХ-фильтр.
Давайте вычислим коэффициенты БИХ-фильтра, выполнив следующие шаги:
- Импортируйте необходимые библиотеки, используя приведенный ниже код Python.
from scipy.signal import iirfilter import numpy as np
- Сгенерируйте аналоговый полосовой фильтр 10-го порядка на 20–100 Гц.
b_num, a_deno = iirfilter(10, [2*np.pi*20, 2*np.pi*100], rs=40, btype='band', analog=True, ftype='cheby2',output='ba') print('Numerator Coeffiecints',b_num) print('Denominator Coeffiecints',b_num)
- В приведенном выше коде выходной параметр равен ba, что означает коэффициенты числителя и знаменателя.
Метод iirfilter()
Аналог параметра логического типа принимается методом iirfilter(), чтобы указать, какой тип БИХ-фильтра мы хотим создать: аналоговый или цифровой. Параметр принимает два значения: «Истина» или «Ложь», истинные значения предназначены для аналогового фильтра, а в противном случае — цифрового фильтра для ложных значений.
Давайте возьмем пример и построим аналоговый БИХ-фильтр, выполнив следующие шаги:
- Импортируйте необходимые библиотеки или методы, используя приведенный ниже код Python.
from scipy.signal import iirfilter
- Создайте цифровой БИХ-фильтр, используя приведенный ниже код.
iirfilter(15,[0.2, 0.9], rs=60, btype='band', analog=False, ftype='cheby2')
В приведенном выше коде мы указали аналоговое значение False, что означает, что приведенный выше вывод представляет собой значения цифрового БИХ-фильтра. Вот как создать цифровой БИХ-фильтр, используя метод iirfilter() с аналогом параметра Python Scipy.