• 模拟滤波器的基础知识和设计


    信号处理工作中滤波器的应用是非常广泛的,可以分成模拟滤波器和数字滤波器两种,数字滤波器主要包括两种,IIR和FIR,这两种滤波器后面统一说,今天先来说一说模拟滤波器(主要是我先用Python实现了Matlab书里面模拟滤波器的一些内容)。

    首先,什么是滤波器,什么又是模拟滤波器

    滤波器:具有频率选择作用的电路或者运算处理系统,具有滤除噪声、分离不同信号的功能,今天主要写的是,1、巴特沃斯滤波器、2、切比雪夫滤波器,3、椭圆滤波器,4、低通到低通的频带转换

    模拟滤波器:更具一组设计规范来设计模拟系统函数H_a(s),使其逼近某个理想滤波器的特性。

    各种模拟滤波器的设计过程都是先设计出低通滤波器,再通过频率变换将低通滤波器转换成其他类型模拟滤波器。

    我们考虑因果系统:

    H_a(j\Omega)=\int_{0}^{\inf}h_a(t)e^{-j\omega t}dt

    其中,h_a(s)是系统的单位脉冲响应,是实函数,那么就有:

    H_a(j\Omega)=\int_{0}^{\inf}h_a(t)(\cos \Omega t-j\sin\Omega t)dt

    实际上有:H_a(-j\Omega)=H_a^*(j\Omega)

    定义模拟滤波器的振幅平方函数为:

    A(\Omega^2)=|H_a(j\Omega)|^2=H_a(j\Omega)H_a^*(j\Omega)

    令:s=j\Omega

    如果要系统稳定,那么A(\Omega^2)=A(-s^2)

    如果我们要让系统函数稳定,就应该选用A(-s^2)在s剖面的左半平面的极点作为H_a(s)的极点。

    来看看今天的内容:

    目录

    1、巴特沃斯滤波器

     2、切比雪夫I型滤波器

     3、切比雪夫II型滤波器

     4、椭圆滤波器(考尔滤波器)

     5、低通到低通的频带变换

    首先,和Jupyter笔记本一样,先导入我们需要的包:

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

    1、巴特沃斯滤波器

    其振幅平方函数为:

    A(\Omega)=|H_a(j\Omega)|^2=\frac{1}{1+(\frac{j\Omega}{j\Omega_c})^{2N}}=\frac{1}{1+(\Omega/\Omega_c)^{2N}}

    其中,N是滤波器的阶数,N越大,带通和傣族的近似性越好,过渡带也就越陡。

    tips:之前一大段时间没有更新,一个是野外没条件,另一个原因就是懒得没有好好去读Scipy.signal的文档,所以说博客有一大段时间空下来了,其实这两天再去读文档,同时对照着Matlab书里面的函数讲解,发现很多都是一样的。

    MATLAB中,buttap函数用来计算N阶巴特沃斯归一化,模拟低通原型滤波器系统函数的零点、极点、增益因子的,Python也一样,返回的都是z,p,k,分别是G(p)的极点、零点、增益

    我们来看一个最简单的例子:产生一个20阶低通模拟滤波器原型,表示为零极点增益形式:

    1. [z,p,k]=signal.buttap(20)
    2. [n,den]=signal.zpk2tf(z,p,k)
    3. [h,w]=signal.freqs(n,den)
    4. plt.subplot(211)
    5. plt.plot(np.abs(h))
    6. plt.grid(True)
    7. plt.subplot(212)
    8. plt.plot(w)
    9. plt.grid(True)

    来看看结果:chule

     说实话,除了这张图以外,其他的我都能和Matlab的对的上。

    那就来看一看不同阶数下的巴特沃斯滤波器的幅频响应曲线:

    1. n=np.linspace(0,2,200,dtype='float')
    2. [z1,p1,k1]=signal.buttap(1)
    3. [num1,den1]=signal.zpk2tf(z1,p1,k1)
    4. [w1,h1]=signal.freqs(num1,den1)
    5. magh1=abs(h1)
    6. [z2,p2,k2]=signal.buttap(3)
    7. [num2,den2]=signal.zpk2tf(z2,p2,k2)
    8. [w2,h2]=signal.freqs(num2,den2)
    9. magh2=abs(h2)
    10. [z3,p3,k3]=signal.buttap(8)
    11. [num3,den3]=signal.zpk2tf(z3,p3,k3)
    12. [w3,h3]=signal.freqs(num3,den3)
    13. magh3=abs(h3)
    14. [z,p,k]=signal.buttap(12)
    15. [num,den]=signal.zpk2tf(z,p,k)
    16. [w,h]=signal.freqs(num,den)
    17. magh=abs(h)
    18. plt.subplot(2,2,1)
    19. plt.plot(magh1)
    20. plt.grid(True)
    21. plt.subplot(2,2,2)
    22. plt.plot(magh2)
    23. plt.grid(True)
    24. plt.subplot(2,2,3)
    25. plt.plot(magh3)
    26. plt.grid(True)
    27. plt.subplot(2,2,4)
    28. plt.plot(magh)
    29. plt.grid(True)

     在已知设计参数\omega_p,\omega_s,R_p,R_s之后,利用buttord函数可以求出所需要的滤波器的阶数和3dB截止频率:

    [n,Wn]=signal.buttord(Wp,Ws,Rp,Rs)

    其中:

    Wp:带通截止频率

    Ws:带阻起始频率

    Rp:通带内波动

    Rs:阻带内最小衰减

    1、低通滤波器:

    1. # 采样速率为10000H在,设计一个低通滤波器,fp=2000Hz,fs=3000H在,Rp=4dB,Rs=30dB
    2. fn=10000
    3. fp=900
    4. fs=600
    5. Rp=3
    6. Rs=20
    7. Wp=(fp/(fn/2))
    8. Ws=fs/(fn/2)
    9. [n,Wn]=signal.buttord(Wp,Ws,Rp,Rs)
    10. [b,a]=signal.butter(n,Wn)
    11. [H,F]=signal.freqz(b,a,1000,8000)
    12. plt.subplot(211)
    13. plt.plot(H,20*np.log10(abs(F)))
    14. plt.xlabel("frequency")
    15. plt.ylabel('altitude')
    16. plt.title("LowPass")
    17. plt.grid(True)
    18. pha=np.angle(F)*180/np.pi
    19. plt.subplot(212)
    20. plt.plot(H,pha)
    21. plt.xlabel("frequency")
    22. plt.ylabel('angle')
    23. plt.grid(True)

    这里有个地方注意一下:Matlab和Python的signal.freqs/z两个函数的输出顺序是不同的,Matlab的输出的H和W和Python输出的H的W两者刚好调换了位置。sheshe

    2、高通滤波器:

    1. # 采样速率为10000H在,设计一高通滤波器,fp=900Hz,fs=600Hz,Rp=3dB,Rs=20dB
    2. fn=10000
    3. fp=900
    4. fs=600
    5. Rp=3
    6. Rs=20
    7. Wp=fp/(fn/2)
    8. Ws=fs/(fn/2)
    9. [n,wn]=signal.buttord(Ws,Wp,Rp,Rs)
    10. [b,a]=signal.butter(n,wn,'high')
    11. [H,F]=signal.freqz(b,a,900,10000)
    12. plt.subplot(211)
    13. plt.plot(H,20*np.log10(abs(F)))
    14. plt.xlabel("frequency")
    15. plt.ylabel('altitude')
    16. plt.title("HighPass")
    17. plt.grid(True)
    18. pha=np.angle(F)*180/np.pi
    19. plt.subplot(212)
    20. plt.plot(H,pha)
    21. plt.xlabel("frequency")
    22. plt.ylabel('angle')
    23. plt.grid(True)

    3、带通滤波器:

    1. fn=10000
    2. fp=np.array([600,1700])
    3. fs=np.array([900,1200])
    4. Rp=4
    5. Rs=30
    6. Wp=fp/(fn/2)
    7. Ws=fs/(fn/2)
    8. [n,wn]=signal.buttord(Wp,Ws,Rp,Rs)
    9. [b,a]=signal.butter(n,wn,'bandpass')
    10. [H,F]=signal.freqz(b,a,1000,10000)
    11. plt.subplot(211)
    12. plt.plot(20*np.log10(abs(F)))
    13. plt.xlabel("frequency")
    14. plt.ylabel('altitude')
    15. plt.title("BandPass")
    16. plt.grid(True)
    17. pha=np.angle(F)*180/np.pi
    18. plt.subplot(212)
    19. plt.plot(pha)
    20. plt.xlabel("frequency")
    21. plt.ylabel('angle')
    22. plt.grid(True)

     4、带阻滤波器:

    1. fn=10000
    2. fp=np.array([600,1700])
    3. fs=np.array([900,1200])
    4. Rp=4
    5. Rs=30
    6. Wp=fp/(fn/2)
    7. Ws=fs/(fn/2)
    8. [n,wn]=signal.buttord(Wp,Ws,Rp,Rs)
    9. [b,a]=signal.butter(n,wn,'bandstop')#看到了吗,低通、高通、带通、带阻的选择方式就是这样
    10. [H,F]=signal.freqz(b,a,1000,10000)
    11. plt.subplot(211)
    12. plt.plot(20*np.log10(abs(F)))
    13. plt.xlabel("frequency")
    14. plt.ylabel('altitude')
    15. plt.title("BandPass")
    16. plt.grid(True)
    17. pha=np.angle(F)*180/np.pi
    18. plt.subplot(212)
    19. plt.plot(pha)
    20. plt.xlabel("frequency")
    21. plt.ylabel('angle')
    22. plt.grid(True)

     2、切比雪夫I型滤波器

    A(\Omega)=|H_a(j\Omega)|^2=\frac{1}{1+\varepsilon ^2 V_N(\Omega/\Omega_c)}

    式中:\Omega_c是有效通带截止频率,\varepsilon是与通带波纹有关的参量,\varepsilon越大,波纹越大,但其范围在(0,1),V_N是N阶切比雪夫多项式:

    V_N=\left\{\begin{matrix} & cos(Narccosx),|x|\leqslant 1\\ & cosh(Narcoshx),|x|>1 \end{matrix}\right.

    这里就不写Matlab的了,直接写Python的:

    [z,p,k]=signal.cheb1ap(N,rs)

    n是阶数,rs是通带的幅度误差,返回值分别是滤波器的零点、极点、增益:

    1. Wp=3*np.pi*4*np.power(12,3)
    2. Ws=3*np.pi*12*np.power(10,3)
    3. rp=1
    4. rs=30
    5. wp=1
    6. ws=Ws/Wp
    7. [N,wc]=signal.cheb1ord(Wp,Ws,rp,rs,'lowpass')
    8. [z,p,k]=signal.cheb1ap(N,rs)
    9. [b,a]=signal.zpk2tf(z,p,k)
    10. w=np.linspace(0,np.pi,50,dtype='float')
    11. [h,w1]=signal.freqs(b,a,w)
    12. plt.plot(h*wc/wp,20*np.log10(abs(w1)))
    13. plt.grid(True)

    1. n=np.linspace(0,4,200,dtype='float')
    2. Rp=1
    3. N1=1
    4. N2=3
    5. N3=5
    6. N4=7
    7. [z1,p1,k1]=signal.cheb1ap(N1,Rp)
    8. [b1,a1]=signal.zpk2tf(z1,p1,k1)
    9. [H1,w1]=signal.freqs(b1,a1,n)
    10. magh1=np.power(np.abs(w1),2)
    11. plt.subplot(2,2,1)
    12. plt.plot(H1,magh1)
    13. plt.grid(True)
    14. [z2,p2,k2]=signal.cheb1ap(N2,Rp)
    15. [b2,a2]=signal.zpk2tf(z2,p2,k2)
    16. [H2,w2]=signal.freqs(b2,a2,n)
    17. magh2=np.power(np.abs(w2),2)
    18. plt.subplot(2,2,2)
    19. plt.plot(H2,magh2)
    20. plt.grid(True)
    21. [z3,p3,k3]=signal.cheb1ap(N3,Rp)
    22. [b3,a3]=signal.zpk2tf(z3,p3,k3)
    23. [H3,w3]=signal.freqs(b3,a3,n)
    24. magh3=np.power(np.abs(w3),2)
    25. plt.subplot(2,2,3)
    26. plt.plot(H3,magh3)
    27. plt.grid(True)
    28. [z4,p4,k4]=signal.cheb1ap(N4,Rp)
    29. [b4,a4]=signal.zpk2tf(z4,p4,k4)
    30. [H4,w4]=signal.freqs(b4,a4,n)
    31. magh4=np.power(np.abs(w4),2)
    32. plt.subplot(2,2,4)
    33. plt.plot(H4,magh4)
    34. plt.grid(True)

     3、切比雪夫II型滤波器

    A(\Omega)=|H_a(j\Omega)|^2=\frac{1}{1+\varepsilon ^2 T^2_N(\Omega/\Omega_c)^{-1}}

    [z,p,k]=signal.cheb2ap(N,rs)

    n是阶数,rs是通带的波动,返回值分别是滤波器的零点、极点、增益。

    1. Wp=3*np.pi*4*np.power(12,3)
    2. Ws=3*np.pi*12*np.power(10,3)
    3. rp=1
    4. rs=30
    5. wp=1
    6. ws=Ws/Wp
    7. [N,wc]=signal.cheb2ord(wp,ws,rp,rs,'s')
    8. [z,p,k]=signal.cheb2ap(N,rs)
    9. [b,a]=signal.zpk2tf(z,p,k)
    10. w=np.linspace(0,np.pi,50,dtype='float')
    11. [h,w]=signal.freqs(b,a,w)
    12. plt.plot(h*wc/wp,20*np.log10(np.abs(w)))
    13. plt.grid(True)

    1. n=np.linspace(0,4,200,dtype='float')
    2. Rp=1
    3. N1=1
    4. N2=3
    5. N3=5
    6. N4=7
    7. Rp=20
    8. [z1,p1,k1]=signal.cheb2ap(N1,Rp)
    9. [b1,a1]=signal.zpk2tf(z1,p1,k1)
    10. [H1,w1]=signal.freqs(b1,a1,n)
    11. magh1=np.power(np.abs(w1),2)
    12. plt.subplot(2,2,1)
    13. plt.plot(H1,magh1)
    14. plt.grid(True)
    15. [z2,p2,k2]=signal.cheb2ap(N2,Rp)
    16. [b2,a2]=signal.zpk2tf(z2,p2,k2)
    17. [H2,w2]=signal.freqs(b2,a2,n)
    18. magh2=np.power(np.abs(w2),2)
    19. plt.subplot(2,2,2)
    20. plt.plot(H2,magh2)
    21. plt.grid(True)
    22. [z3,p3,k3]=signal.cheb2ap(N3,Rp)
    23. [b3,a3]=signal.zpk2tf(z3,p3,k3)
    24. [H3,w3]=signal.freqs(b3,a3,n)
    25. magh3=np.power(np.abs(w3),2)
    26. plt.subplot(2,2,3)
    27. plt.plot(H3,magh3)
    28. plt.grid(True)
    29. [z4,p4,k4]=signal.cheb2ap(N4,Rp)
    30. [b4,a4]=signal.zpk2tf(z4,p4,k4)
    31. [H4,w4]=signal.freqs(b4,a4,n)
    32. magh4=np.power(np.abs(w4),2)
    33. plt.subplot(2,2,4)
    34. plt.plot(H4,magh4)
    35. plt.grid(True)

     4、椭圆滤波器(考尔滤波器)

    这是一种带通和带阻等波纹的滤波器,在阶数相同的的条件下,有着最小的通和带阻波动,其在带通和带阻的波动相同,特点:

    1、是一种零极点型滤波器,在有限频率范围内存在传输零点和极点

    2、其通带和阻带都有着等波纹特性,所以通带、阻带逼近特性良好

    3、在同样的性能要求下,比前两种滤波器所需要的阶数都低,而且其过渡带比较窄。

    A(\Omega)=|H_a(j\Omega)|^2=\frac{1}{1+\varepsilon^2R^2_N(\Omega,L)}

    其中,R_N(\Omega,L)是雅各比椭圆函数,L是一个表示波纹性质的参量。

    [N,wc]=signal.ellipord(wp,ws,rp,rs)

    其功能是求解滤波器的最小阶数,Wp代表通带介质角频率,W是代表阻带起始角频率,Rp表示通带波纹(dB),Rs表示阻带最小衰减(dB)

    [z,p,k]=signal.ellipap(N,rp,rs)

    同样,求解零点、极点、增益。

    1. Wp=3*np.pi*4*np.power(12,3)
    2. Ws=3*np.pi*12*np.power(10,3)
    3. rp=2
    4. rs=25
    5. wp=1
    6. ws=Ws/Wp
    7. [N,wc]=signal.ellipord(wp,ws,rp,rs,'s')
    8. [z,p,k]=signal.ellipap(N,rp,rs)
    9. [b,a]=signal.zpk2tf(z,p,k)
    10. w=np.linspace(0,2*np.pi,67,dtype='float')
    11. [h,w]=signal.freqs(b,a,w)
    12. plt.plot(h,20*np.log10(np.abs(w)))
    13. plt.grid(True)
    14. plt.axis([0,6.5,-50,0])
    15. plt.show()

    1. n=np.linspace(0,2,200,dtype='float')
    2. Rp=1
    3. Rs=15
    4. N1=2
    5. N2=3
    6. N3=5
    7. N4=7
    8. [z,p,k]=signal.ellipap(N1,Rp,Rs)
    9. [b,a]=signal.zpk2tf(z,p,k)
    10. [H,w]=signal.freqs(b,a,n)
    11. magh=np.power(np.abs(w),2)
    12. plt.subplot(221)
    13. plt.plot(H,magh)
    14. plt.axis([0,4,0,1])
    15. plt.grid(True)
    16. [z1,p1,k1]=signal.ellipap(N2,Rp,Rs)
    17. [b1,a1]=signal.zpk2tf(z1,p1,k1)
    18. [H1,w1]=signal.freqs(b1,a1,n)
    19. magh1=np.power(np.abs(w1),2)
    20. plt.subplot(222)
    21. plt.plot(H1,magh1)
    22. plt.axis([0,4,0,1])
    23. plt.grid(True)
    24. [z2,p2,k2]=signal.ellipap(N3,Rp,Rs)
    25. [b2,a2]=signal.zpk2tf(z2,p2,k2)
    26. [H2,w2]=signal.freqs(b2,a2,n)
    27. magh2=np.power(np.abs(w2),2)
    28. plt.subplot(223)
    29. plt.plot(H2,magh2)
    30. plt.axis([0,4,0,1])
    31. plt.grid(True)
    32. [z3,p3,k3]=signal.ellipap(N4,Rp,Rs)
    33. [b3,a3]=signal.zpk2tf(z3,p3,k3)
    34. [H3,w3]=signal.freqs(b3,a3,n)
    35. magh3=np.power(np.abs(w3),2)
    36. plt.subplot(224)
    37. plt.plot(H3,magh3)
    38. plt.axis([0,4,0,1])
    39. plt.grid(True)

     5、低通到低通的频带变换

    [b,a]=signal.lp2lp(bp,ap,Wp)

    wp:模拟低通滤波器的通带截止频率

    ap:归一化模拟低通滤波器的分子

    bp:归一化模拟低通滤波器的分母

    a:频带变换后系统函数的分子

    b:频带变换后系统函数的分母

    来看一个合适的切比雪夫I型滤波器,以实现低通到低通的频带变换

    1. Wp=3*np.pi*5000
    2. Ws=3*np.pi*13000
    3. rp=2
    4. rs=25
    5. wp=1
    6. ws=Ws/Wp
    7. [n,wc]=signal.cheb1ord(wp,ws,rp,rs,'s')
    8. [z,p,k]=signal.cheb1ap(n,wc)
    9. [bp,ap]=signal.zpk2tf(z,p,k)
    10. [b,a]=signal.lp2lp(bp,ap,Wp)
    11. w=np.linspace(0,3*np.pi*30000,250,dtype='float')
    12. [h,w]=signal.freqs(b,a,w)
    13. plt.plot(h/(2*np.pi),20*np.log10(np.abs(w)))
    14. plt.grid(True)

     好了,今天大概就看了这么多,后面的还多着呢,明天再说。

  • 相关阅读:
    NLP经典论文研读--transformer-XL论文源码难点记录
    优秀学习资料汇总
    Android用户切换系统语言后,回到App,App重新加载导致的一些问题[android:configChanges=“layoutDirection“]
    12.MYSQL基础-常见函数
    多线程系列(十五) -常用并发工具类详解
    linux开发板中的数据存储和读取操作
    PHP技能树-资源汇总
    云e办(后端)——邮件发送(员工入职时发送邮件)
    pdfpages 宏包和 includepdf 使用问题
    js发送http请求
  • 原文地址:https://blog.csdn.net/faltas/article/details/133655400