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

您所在的位置:网站首页 滤波设计师 模拟滤波器的基础知识和设计

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

2023-12-14 19:47| 来源: 网络整理| 查看: 265

信号处理工作中滤波器的应用是非常广泛的,可以分成模拟滤波器和数字滤波器两种,数字滤波器主要包括两种,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笔记本一样,先导入我们需要的包:

import numpy as np import matplotlib.pyplot as plt 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阶低通模拟滤波器原型,表示为零极点增益形式:

[z,p,k]=signal.buttap(20) [n,den]=signal.zpk2tf(z,p,k) [h,w]=signal.freqs(n,den) plt.subplot(211) plt.plot(np.abs(h)) plt.grid(True) plt.subplot(212) plt.plot(w) plt.grid(True)

来看看结果:chule

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

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

n=np.linspace(0,2,200,dtype='float') [z1,p1,k1]=signal.buttap(1) [num1,den1]=signal.zpk2tf(z1,p1,k1) [w1,h1]=signal.freqs(num1,den1) magh1=abs(h1) [z2,p2,k2]=signal.buttap(3) [num2,den2]=signal.zpk2tf(z2,p2,k2) [w2,h2]=signal.freqs(num2,den2) magh2=abs(h2) [z3,p3,k3]=signal.buttap(8) [num3,den3]=signal.zpk2tf(z3,p3,k3) [w3,h3]=signal.freqs(num3,den3) magh3=abs(h3) [z,p,k]=signal.buttap(12) [num,den]=signal.zpk2tf(z,p,k) [w,h]=signal.freqs(num,den) magh=abs(h) plt.subplot(2,2,1) plt.plot(magh1) plt.grid(True) plt.subplot(2,2,2) plt.plot(magh2) plt.grid(True) plt.subplot(2,2,3) plt.plot(magh3) plt.grid(True) plt.subplot(2,2,4) plt.plot(magh) 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、低通滤波器:

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

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

2、高通滤波器:

# 采样速率为10000H在,设计一高通滤波器,fp=900Hz,fs=600Hz,Rp=3dB,Rs=20dB fn=10000 fp=900 fs=600 Rp=3 Rs=20 Wp=fp/(fn/2) Ws=fs/(fn/2) [n,wn]=signal.buttord(Ws,Wp,Rp,Rs) [b,a]=signal.butter(n,wn,'high') [H,F]=signal.freqz(b,a,900,10000) plt.subplot(211) plt.plot(H,20*np.log10(abs(F))) plt.xlabel("frequency") plt.ylabel('altitude') plt.title("HighPass") plt.grid(True) pha=np.angle(F)*180/np.pi plt.subplot(212) plt.plot(H,pha) plt.xlabel("frequency") plt.ylabel('angle') plt.grid(True)

3、带通滤波器:

fn=10000 fp=np.array([600,1700]) fs=np.array([900,1200]) Rp=4 Rs=30 Wp=fp/(fn/2) Ws=fs/(fn/2) [n,wn]=signal.buttord(Wp,Ws,Rp,Rs) [b,a]=signal.butter(n,wn,'bandpass') [H,F]=signal.freqz(b,a,1000,10000) plt.subplot(211) plt.plot(20*np.log10(abs(F))) plt.xlabel("frequency") plt.ylabel('altitude') plt.title("BandPass") plt.grid(True) pha=np.angle(F)*180/np.pi plt.subplot(212) plt.plot(pha) plt.xlabel("frequency") plt.ylabel('angle') plt.grid(True)

 4、带阻滤波器:

fn=10000 fp=np.array([600,1700]) fs=np.array([900,1200]) Rp=4 Rs=30 Wp=fp/(fn/2) Ws=fs/(fn/2) [n,wn]=signal.buttord(Wp,Ws,Rp,Rs) [b,a]=signal.butter(n,wn,'bandstop')#看到了吗,低通、高通、带通、带阻的选择方式就是这样 [H,F]=signal.freqz(b,a,1000,10000) plt.subplot(211) plt.plot(20*np.log10(abs(F))) plt.xlabel("frequency") plt.ylabel('altitude') plt.title("BandPass") plt.grid(True) pha=np.angle(F)*180/np.pi plt.subplot(212) plt.plot(pha) plt.xlabel("frequency") plt.ylabel('angle') 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是通带的幅度误差,返回值分别是滤波器的零点、极点、增益:

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

n=np.linspace(0,4,200,dtype='float') Rp=1 N1=1 N2=3 N3=5 N4=7 [z1,p1,k1]=signal.cheb1ap(N1,Rp) [b1,a1]=signal.zpk2tf(z1,p1,k1) [H1,w1]=signal.freqs(b1,a1,n) magh1=np.power(np.abs(w1),2) plt.subplot(2,2,1) plt.plot(H1,magh1) plt.grid(True) [z2,p2,k2]=signal.cheb1ap(N2,Rp) [b2,a2]=signal.zpk2tf(z2,p2,k2) [H2,w2]=signal.freqs(b2,a2,n) magh2=np.power(np.abs(w2),2) plt.subplot(2,2,2) plt.plot(H2,magh2) plt.grid(True) [z3,p3,k3]=signal.cheb1ap(N3,Rp) [b3,a3]=signal.zpk2tf(z3,p3,k3) [H3,w3]=signal.freqs(b3,a3,n) magh3=np.power(np.abs(w3),2) plt.subplot(2,2,3) plt.plot(H3,magh3) plt.grid(True) [z4,p4,k4]=signal.cheb1ap(N4,Rp) [b4,a4]=signal.zpk2tf(z4,p4,k4) [H4,w4]=signal.freqs(b4,a4,n) magh4=np.power(np.abs(w4),2) plt.subplot(2,2,4) plt.plot(H4,magh4) 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是通带的波动,返回值分别是滤波器的零点、极点、增益。

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

n=np.linspace(0,4,200,dtype='float') Rp=1 N1=1 N2=3 N3=5 N4=7 Rp=20 [z1,p1,k1]=signal.cheb2ap(N1,Rp) [b1,a1]=signal.zpk2tf(z1,p1,k1) [H1,w1]=signal.freqs(b1,a1,n) magh1=np.power(np.abs(w1),2) plt.subplot(2,2,1) plt.plot(H1,magh1) plt.grid(True) [z2,p2,k2]=signal.cheb2ap(N2,Rp) [b2,a2]=signal.zpk2tf(z2,p2,k2) [H2,w2]=signal.freqs(b2,a2,n) magh2=np.power(np.abs(w2),2) plt.subplot(2,2,2) plt.plot(H2,magh2) plt.grid(True) [z3,p3,k3]=signal.cheb2ap(N3,Rp) [b3,a3]=signal.zpk2tf(z3,p3,k3) [H3,w3]=signal.freqs(b3,a3,n) magh3=np.power(np.abs(w3),2) plt.subplot(2,2,3) plt.plot(H3,magh3) plt.grid(True) [z4,p4,k4]=signal.cheb2ap(N4,Rp) [b4,a4]=signal.zpk2tf(z4,p4,k4) [H4,w4]=signal.freqs(b4,a4,n) magh4=np.power(np.abs(w4),2) plt.subplot(2,2,4) plt.plot(H4,magh4) 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)

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

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

n=np.linspace(0,2,200,dtype='float') Rp=1 Rs=15 N1=2 N2=3 N3=5 N4=7 [z,p,k]=signal.ellipap(N1,Rp,Rs) [b,a]=signal.zpk2tf(z,p,k) [H,w]=signal.freqs(b,a,n) magh=np.power(np.abs(w),2) plt.subplot(221) plt.plot(H,magh) plt.axis([0,4,0,1]) plt.grid(True) [z1,p1,k1]=signal.ellipap(N2,Rp,Rs) [b1,a1]=signal.zpk2tf(z1,p1,k1) [H1,w1]=signal.freqs(b1,a1,n) magh1=np.power(np.abs(w1),2) plt.subplot(222) plt.plot(H1,magh1) plt.axis([0,4,0,1]) plt.grid(True) [z2,p2,k2]=signal.ellipap(N3,Rp,Rs) [b2,a2]=signal.zpk2tf(z2,p2,k2) [H2,w2]=signal.freqs(b2,a2,n) magh2=np.power(np.abs(w2),2) plt.subplot(223) plt.plot(H2,magh2) plt.axis([0,4,0,1]) plt.grid(True) [z3,p3,k3]=signal.ellipap(N4,Rp,Rs) [b3,a3]=signal.zpk2tf(z3,p3,k3) [H3,w3]=signal.freqs(b3,a3,n) magh3=np.power(np.abs(w3),2) plt.subplot(224) plt.plot(H3,magh3) plt.axis([0,4,0,1]) plt.grid(True)

 5、低通到低通的频带变换 [b,a]=signal.lp2lp(bp,ap,Wp)

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

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

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

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

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

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

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3