python库函数之scipy.signal——滤波器设计

python库函数之scipy.signal.butter()

参考官方的API文档(https://docs.scipy.org/doc/scipy/reference/signal.html#module-scipy.signal)
注意最好将scipy升级至最新版本。笔者之前使用v1.1.1,其函数的部分参数与新版本的不一样。

scipy.signal.butter(N, Wn, btype=‘low’, analog=False, output=‘ba’, fs=None)

函数参数

  • N:滤波器阶数
  • Wn:3dB带宽点。
  • btype:滤波器类型,可选{‘lowpass’, ‘highpass’, ‘bandpass’, ‘bandstop’},默认是低通滤波器。
  • analog : 布尔值。True表示模拟滤波器。False表示数字滤波器。默认是数字滤波器。
  • output:'ba’表示’输出分子和分母的系数;‘zpk’表示输出零极点;‘sos’表示输出second-order sections. 默认是‘ba’
  • fs:数字滤波器采样率

设计模拟滤波器

>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>>
>>> b, a = signal.butter(4, 100, 'low', analog=True)
>>> w, h = signal.freqs(b, a)                        # 由分子分母的系数求解频率响应,w为频率,h为对应的响应。
>>> plt.semilogx(w, 20 * np.log10(abs(h))) 	#绘制幅频响应,频率轴取对数,幅度轴转换成dB。
>>> 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()

在这里插入图片描述

设计数字滤波器

>>> t = np.linspace(0, 1, 1000, False)  # 1 second
>>> sig = np.sin(2*np.pi*10*t) + np.sin(2*np.pi*20*t)    # 构造10hz和20hz的两个信号
>>> 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])

>>>
>>> sos = signal.butter(10, 15, 'hp', fs=1000, output='sos')     #采样率为1000hz,带宽为15hz,输出sos
>>> filtered = signal.sosfilt(sos, sig)             #将信号和通过滤波器作用,得到滤波以后的结果。在这里sos有点像冲击响应,这个函数有点像卷积的作用。
>>> 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()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq7835144/article/details/88838537