В этом уроке Python мы узнаем о «Python Scipy Freqz», который обычно используется для работы с аналоговой и цифровой частотой.
Метод freqz()
Для вычисления частотной характеристики цифрового фильтра в Python Scipy есть метод freqz() в модуле scipy.signal.
Определите частотную характеристику цифрового фильтра путем вычисления его числителя M-порядка b и знаменателя N-порядка a.
Синтаксис:
scipy.signal.freqz(b, a=1, whole=False, worN=512, plot=None, include_nyquist=False, fs=6.28318530717958)
Где параметры:
- b (array_data): числитель линейного фильтра B.shape[1:], a.shap[1:] и форма массива частот должны быть совместимы для вещания, если b имеет размерность больше 1, что считается быть так.
- a(array_data): линейный знаменатель фильтра. Предполагается, что коэффициенты сохраняются в первом измерении, если размерность b превышает 1, а формы b.shape[1:], a.shape[1:] и Массив частот должен соответствовать вещанию.
- whole (логическое значение): частота Найквиста, fs/2, представляет собой стандартный диапазон, на основе которого рассчитываются частоты(верхняя половина единичного круга). Выполните расчет частоты от 0 до fs, если все верно. игнорируется, если работа похожа на массив.
- wordN (int, array, None): Вычислить на таком количестве частот, если имеется только одно целое число(значение N по умолчанию — 512). Это практическая замена: «np.linspace(), fs if all else fs/2, N, endpoint=include_nyquist)». Можно ускорить вычисления, используя быстрое число для вычислений БПФ. Вычислите ответ на заданных частотах, если данные похожи на массив. Они измеряются в единицах, совместимых с fs.
- plot: вызов функции, принимающей два аргумента. Возвращаемые параметры w и h отправляются на график, если они присутствуют. полезно для отображения частотной характеристики в пределах частоты.
- include_nyquist (boolean): Включить nyquist будет включать самую последнюю частоту (частоту Найквиста), если целое имеет значение False и worN является целым числом; в противном случае оно будет опущено.
- fs (float): частота дискретизации системы в цифровой форме. По умолчанию используется значение радианы/выборка при 2*пи(то есть w от 0 до пи).
Метод freqz() возвращает w (частоты, на которых рассчитывался h, выраженные в единицах, совместимых с fs. W часто нормализуется до диапазона 0, пи) и h(комплексные числа, представляющие частотную характеристику) типа ndarray.
Давайте рассмотрим пример, выполнив следующие шаги:
- Импортируйте необходимые библиотеки и вычислите частотную характеристику цифрового фильтра, используя приведенный ниже код.
from scipy.signal import firwin, freqz sig = firwin(50, 0.2, window=('kaiser', 5)) w, h = freqz(sig) print(w[1],h[1])
Формат Sos
Для расчета частотной характеристики цифрового фильтра в формате SOS. Модуль 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))
Частоты
Для вычисления частотной характеристики аналогового фильтра Python Scipy содержит метод freqs() в модуле scipy.signal.
Синтаксис:
scipy.signal.freqs(b, a, worN=200, plot=None)
Где параметры:
- b (array_data): числитель B линейного фильтра.
- a (array_data): линейный знаменатель фильтра.
- wordN (int, array, None): если None, то вычисления производятся на частоте 200 Гц вокруг интересующих областей кривой отклика(определяемых местоположениями полюса и нуля). Если это одно целое число, вычислите его за такое количество итераций. В любом другом случае рассчитайте отклик, используя предоставленные в работе угловые частоты(например, рад/с).
- plot: вызов функции, принимающей два аргумента. Возвращаемые параметры w и h отправляются на график, если они присутствуют. полезно для отображения частотной характеристики в пределах частот.
Метод freqz_zpk()
В Python Scipy есть метод freqz_zpk() в модуле scipy.signal, который вычисляет форму ZPK частотной характеристики цифрового фильтра.
Синтаксис:
scipy.signal.freqz_zpk(z, p, k, worN=512, whole=False, fs=6.283185307179586)
Где параметры:
- z (array_data): фильтрует нули в линейном виде.
- p (array_data): полюса линейного фильтра.
- k (скаляр): коэффициент усиления линейного фильтра.
- worN (логическое значение): частота Найквиста, 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 до пи).
Метод freqz_zpk() возвращает w (частоты, на которых рассчитывался h, выраженные в единицах, совместимых с fs. W часто нормализуется до диапазона 0, пи) и h(комплексные числа, представляющие частотную характеристику) типа ndarray.
Давайте рассмотрим пример, создав систему с частотой дискретизации 1000 Гц и цифровой фильтр Баттерворта 4-го порядка с частотой среза 100 Гц, используя приведенный ниже код.
from scipy import signal zeroes_filt, pole_filt, gain_filt = signal.butter(4, 100, output='zpk', fs=1000) w, h = signal.freqz_zpk(zeroes_filt, pole_filt, gain_filt, fs=1000) print("w = {},h={}".format(w,h))
Частоты сигналов Zpk
В Python Scipy есть метод freqs_zpk() в модуле scipy.signal, который вычисляет частотную характеристику аналогового фильтра.
Синтаксис:
scipy.signal.freqz_zpk(z, p, k, worN=200)
Где параметры:
- z (array_data): фильтрует нули в линейном виде.
- p (array_data): полюса линейного фильтра.
- k (скаляр): коэффициент усиления линейного фильтра.
- wordN (int, array, None): если None, то вычисления производятся на частоте 200 Гц вокруг интересующих областей кривой отклика(определяемых местоположениями полюса и нуля). Если это одно целое число, вычислите его за такое количество итераций. В любом другом случае рассчитайте отклик, используя предоставленные в работе угловые частоты(например, рад/с).
Метод freqs_zpk() возвращает w (угловые частоты, которые использовались для расчета h) и h (отклик на частоту) типа ndarray.
Давайте рассмотрим пример, выполнив следующие шаги:
- Импортируйте необходимые библиотеки, используя приведенный ниже код Python.
from scipy import signal import numpy as np
- Создайте аналоговый фильтр 5-го порядка, затем предоставьте коэффициенты фильтра, используя приведенный ниже код.
zeroes_filt, pole_filt, gain_filt = signal.iirfilter(5, [1, 10], 1, 50, analog=True, ftype='cheby1', output='zpk') w, h = signal.freqs_zpk(zeroes_filt, pole_filt, gain_filt, worN=np.logspace(-1, 2, 9000))
- Проверьте результат, возвращаемый методом freqs_zpk(), используя приведенный ниже код.
print("w = {},h={}".format(w,h))
Метод iirfilter()
Мы узнали о методе freqz() в приведенном выше подразделе, здесь мы спроектируем фильтр, используя метод iirfilter(), и результат этого метода перенесем в метод 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))
Пример
Мы уже знаем о методе freqz() Python Scipy. Здесь, в этом разделе, мы приведем еще один пример, связанный с частотной характеристикой цифрового фильтра.
Давайте рассмотрим пример, выполнив следующие шаги:
- Импортируйте необходимые библиотеки, используя приведенный ниже код Python.
from scipy.signal import iirfilter, freqz import numpy as np
- Создайте аналоговый полосовой фильтр Чебышева II 10-го порядка с частотой 40–150 Гц, используя приведенный ниже код.
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))