用python进行信号分析(一) - 滤波器设计

[复制链接]
 楼主| 会笑的星星 发表于 2021-7-20 15:09 | 显示全部楼层 |阅读模式
本帖最后由 会笑的星星 于 2021-7-20 15:12 编辑

当我们需要设计信号处理算法时,可以使用现成的工具来进行信号仿真与分析,为我们算法设计提供指导。在仿真与分析工具中,有名当然是MATLAB,而后起之秀是Python。Python有十分强大且免费的第三方库,包含各种信号处理算法。从这篇**开始,我将围绕Python的Numpy、Scipy、matplotlib、pandas以及其他的第三方库来完成(低通、高通、带通等)滤波器设计、陷波器、FFT、希尔伯特变换、希尔伯特-黄变换、小波变换,以便理解与使用这些看似高大上的信号处理算法,知道什么时候可以尝试使用什么算法。

首先,看看滤波器的设计。

一般而言,滤波器按照滤波方式可分为低通滤波、高通滤波、带通滤波、带阻滤波。按照滤波器种类,又可分为巴特沃斯滤波器、椭圆滤波、切比雪夫滤波、贝塞尔滤波器等。下面,先看看如何用Pyhton设计一个滤波器,然后利用这个滤波器看看实际的滤波效果,最后对比一下椭圆滤波器、切比雪夫滤波器、贝塞尔滤波器等幅频特性。

先看问题。我们现在需要设计一个椭圆滤波器,要求滤波器阶数为10,通带范围20~100HZ,通带的纹波最大1dB,阻带最小衰减60dB,采样率为1k。用python的scipy模块的signal模块来设计这个滤波器。代码如下:
  1. # -*- coding: utf-8 -*-

  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from scipy import signal

  5. #iirfilter函数参数说明,详见[1]
  6. #第一个参数是滤波器的阶数
  7. #第二个参数是滤波器的通带频率
  8. #rp是通带纹波最大波动1dB
  9. #rs是阻带最小衰减
  10. #btype是滤波器的滤波方式,除了band以外,还有lowpass、highpass等
  11. #analog是选择该滤波器为模拟滤波器(True)还是数字滤波器(False)
  12. #ftype是滤波器的种类,除了ellip,还有bessel、cheby2等
  13. #fs为数字信号的采样率
  14. #output是滤波器函数的返回值类型,这也是官方推荐的返回值类型
  15. sos = signal.iirfilter(10,[20,100], rp = 1, rs=60, btype='bandpass',
  16.                        analog=False, ftype='ellip',fs=1000,output='sos')
  17. #通过iirfilter得到了滤波器,我们接着使用sosfreqz获得该滤波器的频率响应

上述滤波器的幅频特性如下图所示


得到了这个椭圆滤波器,我们接下来看看,这个滤波器的过滤效果,看下面代码
  1. # -*- coding: utf-8 -*-

  2. import matplotlib.pyplot as plt
  3. from scipy import signal
  4. import numpy as np

  5. fs1 = 1000 #采样率1000Hz
  6. t = np.arange(fs1)/1000
  7. y1 = np.sin(2*np.pi*50*t)
  8. y2 = np.sin(2*np.pi*110*t)
  9. s = y1 + y2

  10. sos = signal.iirfilter(10,[20,100], rp = 1, rs=60, btype='bandpass',
  11.                        analog=False, ftype='ellip',fs=1000,output='sos')
  12. #使用滤波器sos过滤信号s,详见[3]
  13. y = signal.sosfilt(sos, s)

  14. plt.subplot(3, 1, 1)
  15. plt.plot(t,s)
  16. plt.ylabel('50Hz+110Hz')

  17. plt.subplot(3, 1, 2)
  18. plt.plot(t,y1)
  19. plt.ylabel('50Hz')

  20. plt.subplot(3, 1, 3)
  21. plt.plot(t,y)
  22. plt.ylabel('filtered waveform')
  23. plt.show()
过滤结果对比如下如所示,可以看到,在第三个图中很好的过滤掉了混合信号s中110Hz的信号





最后,我们来对比一下,采用上述生成的滤波器,仅仅更换不同的滤波器种类,对比一下几种不同滤波器的幅频特性。这里,我直接给出对比图。

可以看出,不论从通带、阻带、过渡带来看,椭圆滤波器的滤波器性能是最优的,其次是切比雪夫II型滤波器,然后是巴特沃斯滤波器,最后才是贝塞尔滤波器。当然,要注意的是,虽然椭圆滤波器的滤波性能优良,但是就一个滤波器而言,可能还需考虑计算成本,以及相频特性,结合三者才能合理的选择一个合适的滤波器。尽管如此,但对于研究算法而言,先在计算机上仿真,用最佳性能的滤波器处理信号以让我们看到或者接近算法的边界依然是很有参考价值的。

对于更多更多的滤波器设计,请参考scipy的signal模块。

[1]https://docs.scipy.org/doc/scipy/reference/reference/generated/scipy.signal.iirfilter.html#scipy.signal.iirfilter

[2]https://docs.scipy.org/doc/scipy/reference/reference/generated/scipy.signal.sosfreqz.html#scipy.signal.sosfreqz

[3]https://docs.scipy.org/doc/scipy/reference/reference/generated/scipy.signal.sosfilt.html#scipy.signal.sosfilt





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 会笑的星星 发表于 2021-7-20 15:12 | 显示全部楼层

评论

楼主可以分享一下幅频特性的代码吗,万分感谢  发表于 2022-4-25 20:39
 楼主| 会笑的星星 发表于 2021-7-21 13:36 | 显示全部楼层
真是寂寞
红蛋大叔 发表于 2021-7-24 10:51 | 显示全部楼层
顶顶,了却你的寂寞
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

96

帖子

17

粉丝
快速回复 在线客服 返回列表 返回顶部