scipy.signal.

乳制品#

scipy.signal.butter(N, Wn, btype='low', analog=False, output='ba', fs=None)[source]#

巴特沃斯数字和模拟滤波器设计。

设计 N 阶数字或模拟巴特沃斯滤波器,并返回滤波器系数。

参数:
Nint

滤波器的阶数。对于“带通”和“带阻”滤波器,最终二阶节(“sos”)矩阵的阶数为 2*N,其中N为所需系统双二次滤波节的个数。

Wn类数组

临界频率或临界频率序列。对于低通和高通滤波器,Wn 是标量;对于带通和带阻滤波器,Wn 是长为 2 的序列。

对于巴特沃斯滤波器,这是增益下降到通带(“-3 dB 点”)的 1/sqrt(2) 的点。

对于数字滤波器,如果未指定 fs,将对 Wn 单位进行归一化,范围从 0 到 1,其中 1 是奈奎斯特频率(Wn 因此表示为半周期/采样,并定义为 2*临界频率/fs)。如果指定了 fsWn 将与 fs 的单位相同。

对于模拟滤波器,Wn 是角频率(例如 rad/s)。

btype{‘lowpass’, ‘highpass’, ‘bandpass’, ‘bandstop’}, optional

滤波器类型。默认值为“lowpass”。

analogbool, optional

为 True 时,返回模拟滤波器,否则返回数字滤波器。

output{‘ba’, ‘zpk’, ‘sos’}, optional

输出类型:分子/分母(‘ba’)、极零(‘zpk’)或二阶节(‘sos’)。为了向后兼容,默认值为 ‘ba’;但对于通用过滤,应使用 ‘sos’。

fsfloat, optional

数字系统的采样频率。

在 1.2.0 版本中添加。

返回:
b, andarray, ndarray

IIR 滤波器的分子 (b) 和分母 (a) 多项式。仅在 output='ba' 的情况下返回。

z, p, kndarray, ndarray, float

IIR 滤波器传递函数的零点、极点和系统增益。仅在 output='zpk' 的情况下返回。

sosndarray

IIR 滤波器的二阶节表示形式。仅在 output='sos' 的情况下返回。

另请参见

buttord, buttap

注释

巴特沃斯滤波器在通带中具有最大平坦的频率响应。

在 0.16.0 中添加了 'sos' 输出参数。

如果请求传输函数形式 [b, a],可能会出现数值问题,因为根与多项式系数之间的转换是一种对数值敏感的操作,即使对于 N >= 4 也是如此。建议使用 SOS 表示形式。

警告

由于浮点精度的数值问题,以 TF 形式设计高阶和窄带 IIR 滤波器会导致不稳定的、错误的滤波。考虑检查输出滤波器特性 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 [radians / second]')
>>> plt.ylabel('Amplitude [dB]')
>>> plt.margins(0, 0.1)
>>> plt.grid(which='both', axis='both')
>>> plt.axvline(100, color='green') # cutoff frequency
>>> plt.show()
../../_images/scipy-signal-butter-1_00_00.png

生成一个由 10 Hz 和 20 Hz 构成的信号,采样频率为 1 kHz

>>> 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 Hz 设计一个数字高通滤波器以去除 10 Hz 音调,并将其应用于信号。(建议在滤波时使用二阶段格式,以避免传递函数 (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 [seconds]')
>>> plt.tight_layout()
>>> plt.show()
../../_images/scipy-signal-butter-1_01_00.png