butter#
- scipy.signal.butter(N, Wn, btype='low', аналог=False, вывод='ba', fs=None)[источник]#
Проектирование цифровых и аналоговых фильтров Баттерворта.
Спроектировать цифровой или аналоговый фильтр Баттерворта N-го порядка и вернуть коэффициенты фильтра.
- Параметры:
- Nint
Порядок фильтра. Для фильтров 'bandpass' и 'bandstop', результирующий порядок финальной матрицы секций второго порядка ('sos')
2*N, с N количество биквадратных секций желаемой системы.- Wnarray_like
Критическая частота или частоты. Для фильтров нижних и верхних частот Wn является скаляром; для полосовых и режекторных фильтров Wn является последовательностью длины 2.
Для фильтра Баттерворта это точка, в которой усиление падает до 1/sqrt(2) от полосы пропускания (точка «-3 дБ»).
Для цифровых фильтров, если fs не указан, Wn единицы измерения нормализованы от 0 до 1, где 1 — частота Найквиста (Wn следовательно, в полуциклах / выборка и определяется как 2*критические частоты / fs). Если fs указан, Wn в тех же единицах, что и fs.
Для аналоговых фильтров, Wn является угловой частотой (например, рад/с).
- btype{‘lowpass’, ‘highpass’, ‘bandpass’, ‘bandstop’}, необязательно
Тип фильтра. По умолчанию — 'lowpass'.
- аналогbool, необязательно
Если True, возвращает аналоговый фильтр, в противном случае возвращается цифровой фильтр.
- вывод{‘ba’, ‘zpk’, ‘sos’}, опционально
Тип вывода: числитель/знаменатель ('ba'), полюс-ноль ('zpk') или секции второго порядка ('sos'). По умолчанию 'ba' для обратной совместимости, но 'sos' следует использовать для фильтрации общего назначения.
- fsfloat, опционально
Частота дискретизации цифровой системы.
Добавлено в версии 1.2.0.
- Возвращает:
- b, aСоздать LinearOperators
Числитель (b) и знаменатель (a) полиномы IIR-фильтра. Возвращается только если
output='ba'.- z, p, kndarray, ndarray, float
Нули, полюсы и коэффициент усиления системы передаточной функции фильтра IIR. Возвращается только если
output='zpk'.- sosndarray
Представление фильтра IIR в виде звеньев второго порядка. Возвращается только если
output='sos'.
Примечания
Фильтр Баттерворта имеет максимально плоскую частотную характеристику в полосе пропускания.
The
'sos'выходной параметр был добавлен в версии 0.16.0.Если форма передаточной функции
[b, a]запрошено, могут возникнуть численные проблемы, поскольку преобразование между корнями и коэффициентами полинома является численно чувствительной операцией, даже для N >= 4. Рекомендуется работать с SOS представлением.Предупреждение
Проектирование фильтров БИХ высокого порядка и узкополосных в форме передаточной функции может привести к нестабильной или некорректной фильтрации из-за проблем с численной точностью чисел с плавающей запятой. Рекомендуется проверять характеристики выходного фильтра.
freqzили проектирования фильтров с секциями второго порядка черезoutput='sos'.Примеры
Спроектировать аналоговый фильтр и построить его частотную характеристику, показывая критические точки:
>>> from scipy import signal >>> import matplotlib.pyplot as plt >>> import numpy as np
>>> b, a = signal.butter(4, 100, 'low', analog=True) >>> w, h = signal.freqs(b, a) >>> plt.semilogx(w, 20 * np.log10(abs(h))) >>> plt.title('Butterworth filter frequency response') >>> plt.xlabel('Frequency [rad/s]') >>> plt.ylabel('Amplitude [dB]') >>> plt.margins(0, 0.1) >>> plt.grid(which='both', axis='both') >>> plt.axvline(100, color='green') # cutoff frequency >>> plt.show()
Сгенерировать сигнал, состоящий из 10 Гц и 20 Гц, с частотой дискретизации 1 кГц
>>> t = np.linspace(0, 1, 1000, False) # 1 second >>> sig = np.sin(2*np.pi*10*t) + np.sin(2*np.pi*20*t) >>> fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True) >>> ax1.plot(t, sig) >>> ax1.set_title('10 Hz and 20 Hz sinusoids') >>> ax1.axis([0, 1, -2, 2])
Спроектировать цифровой высокочастотный фильтр на 15 Гц для удаления тона 10 Гц и применить его к сигналу. (Рекомендуется использовать формат секций второго порядка при фильтрации, чтобы избежать численной ошибки с передаточной функцией (
ba) формат):>>> sos = signal.butter(10, 15, 'hp', fs=1000, output='sos') >>> filtered = signal.sosfilt(sos, sig) >>> ax2.plot(t, filtered) >>> ax2.set_title('After 15 Hz high-pass filter') >>> ax2.axis([0, 1, -2, 2]) >>> ax2.set_xlabel('Time [s]') >>> plt.tight_layout() >>> plt.show()