• Автор записи:
  • Рубрика записи:Scipy
  • Время чтения:4 минут чтения
  • Комментарии к записи:0 комментариев

В приложениях цифровой обработки сигналов(DSP) используется один из двух основных типов цифровых фильтров — БИХ-фильтры (второй тип — КИХ). Бесконечная импульсная характеристика называется «IIR».

Благодаря обратной связи в фильтре импульсная характеристика является «бесконечной», а это означает, что если вы примените импульс(одну выборку «1», за которой следуют несколько выборок «0»), вы получите бесконечное количество ненулевых значений.

БИХ-фильтры используют меньше памяти и вычислений для достижения заданной характеристики фильтрации, чем сопоставимый КИХ-фильтр.

Содержание

Функция 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))

метод iirfilter()

Фильтр 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))

метод sosfreqz()

Проектирование 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_)

Проектирование IIR-фильтра Python Scipy

Полосовые фильтры

Полосовой фильтр — это электрический компонент или схема, которая различает сигналы на других частотах, позволяя при этом проходить сигналам между двумя назначенными частотами.

Активные полосовые фильтры — это полосовые фильтры, в которых используются активные части, такие как транзисторы и интегральные схемы, которым требуется внешний источник питания. Пассивные полосовые фильтры — это те, которые не требуют внешнего источника питания и полностью состоят из пассивных частей, таких как конденсаторы и катушки индуктивности.

Метод 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

Коэффициенты фильтра

Метод 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, что означает коэффициенты числителя и знаменателя.

Коэффициенты фильтра Python Scipy IIR

Метод iirfilter()

Аналог параметра логического типа принимается методом iirfilter(), чтобы указать, какой тип БИХ-фильтра мы хотим создать: аналоговый или цифровой. Параметр принимает два значения: «Истина» или «Ложь», истинные значения предназначены для аналогового фильтра, а в противном случае — цифрового фильтра для ложных значений.

Давайте возьмем пример и построим аналоговый БИХ-фильтр, выполнив следующие шаги:

  • Импортируйте необходимые библиотеки или методы, используя приведенный ниже код Python.
from scipy.signal import iirfilter
  • Создайте цифровой БИХ-фильтр, используя приведенный ниже код.
iirfilter(15,[0.2, 0.9], rs=60,
                        btype='band', analog=False, ftype='cheby2')

Метод iirfilter()

В приведенном выше коде мы указали аналоговое значение False, что означает, что приведенный выше вывод представляет собой значения цифрового БИХ-фильтра. Вот как создать цифровой БИХ-фильтр, используя метод iirfilter() с аналогом параметра Python Scipy.

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