巴特沃斯滤波器详解

巴特沃斯滤波器

这里不再赘述低通、高通、带通、带阻滤波器等

巴特沃斯(Butterworth)滤波器在现代设计方法设计的滤波器中,是最为有名的滤波器,由于它设计简单,性能方面又没有明显的缺点,又因它对构成滤波器的元件Q值较低,因而易于制作且达到设计性能,因而得到了广泛应用。其中,巴特沃斯滤波器的特点是通频带的频率响应曲线最平滑。

巴特沃斯滤波器传递函数

巴特沃斯低通滤波器可用如下振幅的平方对频率的公式表示:
∣ H ( ω ) ∣ 2 = 1 1 + ( ω ω c ) 2 n = 1 1 + ϵ 2 ( ω ω p ) 2 n |H(\omega)|^2 = \frac{1}{1+(\frac{\omega}{\omega_c})^{2n}} = \frac{1}{1+\epsilon^2(\frac{\omega}{\omega_p})^{2n}} H(ω)2=1+(ωcω)2n1=1+ϵ2(ωpω)2n1
其中, n n n为滤波器的阶数, ω c \omega_c ωc为截至频率,即振幅下降为 − 3 d B -3dB 3dB时的频率, ω p \omega_p ωp为通频带边缘频率。

下图为巴特沃斯滤波器的频率响应图

巴特沃斯滤波器详解_第1张图片

n − > ∞ n->\infty n>时,得到一个理想的低通滤波反馈: ω ω c < 1 \frac{\omega}{\omega_c} < 1 ωcω<1时,增益为1; ω ω c > 1 \frac{\omega}{\omega_c} > 1 ωcω>1时,增益为0; ω ω c = 1 \frac{\omega}{\omega_c} = 1 ωcω=1时,增益为0.707

巴特沃斯滤波器的特点是通频带内的频率响应曲线最大限度平坦,没有起伏,而在阻频带则逐渐下降为零。 在振幅的对数对角频率的波特图上,从某一边界角频率开始,振幅随着角频率的增加而逐步减少,趋向负无穷大。巴特沃斯滤波器的频率特性曲线,无论在通带内还是阻带内都是频率的单调函数。因此,当通带的边界处满足指标要求时,通带内肯定会有裕量。所以,更有效的设计方法应该是将精确度均匀的分布在整个通带或阻带内,或者同时分布在两者之内。这样就可用较低阶数的系统满足要求。这可通过选择具有等波纹特性的逼近函数来达到。

python代码

from scipy import signal

1、低通滤波

这里假设采样频率为1000hz,信号本身最大的频率为500hz,要滤除400hz以上频率成分,即截至频率为400hz,则wn=2*400/1000=0.8。Wn=0.8

b, a = signal.butter(8, 0.8, 'lowpass')   #配置滤波器 8 表示滤波器的阶数
filtedData = signal.filtfilt(b, a, data)  #data为要过滤的信号

2、高通滤波

这里假设采样频率为1000hz,信号本身最大的频率为500hz,要滤除100hz以下频率成分,即截至频率为100hz,则wn=2*100/1000=0.2。Wn=0.2

b, a = signal.butter(8, 0.2, 'highpass')   #配置滤波器 8 表示滤波器的阶数
filtedData = signal.filtfilt(b, a, data)  #data为要过滤的信号

3、带通滤波

这里假设采样频率为1000hz,信号本身最大的频率为500hz,要滤除100hz以下,400hz以上频率成分,即截至频率为100,400hz,则wn1=2100/1000=0.2,Wn1=0.2; wn2=2400/1000=0.8,Wn2=0.8。Wn=[0.02,0.8]

b, a = signal.butter(8, [0.2,0.8], 'bandpass')   #配置滤波器 8 表示滤波器的阶数
filtedData = signal.filtfilt(b, a, data)  #data为要过滤的信号

4、带阻滤波

这里假设采样频率为1000hz,信号本身最大的频率为500hz,要滤除100hz以上,400hz以下频率成分,即截至频率为100,400hz,则wn1=2100/1000=0.2,Wn1=0.2; wn2=2400/1000=0.8,Wn2=0.8。Wn=[0.02,0.8],和带通相似,但是带通是保留中间,而带阻是去除。

b, a = signal.butter(8, [0.2,0.8], 'bandstop')   #配置滤波器 8 表示滤波器的阶数
filtedData = signal.filtfilt(b, a, data)  #data为要过滤的信号

函数介绍

scipy.signal.filtfilt(b, a, x, axis=-1, padtype='odd', padlen=None, method='pad', irlen=None)

输入参数:
b: 滤波器的分子系数向量
a: 滤波器的分母系数向量
x: 要过滤的数据数组。(array型)
axis: 指定要过滤的数据数组x的轴
padtype: 必须是“奇数”、“偶数”、“常数”或“无”。这决定了用于过滤器应用的填充信号的扩展类型。{‘odd’, ‘even’, ‘constant’, None}
padlen:在应用滤波器之前在轴两端延伸X的元素数目。此值必须小于要滤波元素个数- 1。(int型或None)
method:确定处理信号边缘的方法。当method为“pad”时,填充信号;填充类型padtype和padlen决定,irlen被忽略。当method为“gust”时,使用古斯塔夫森方法,而忽略padtype和padlen。{“pad” ,“gust”}
irlen:当method为“gust”时,irlen指定滤波器的脉冲响应的长度。如果irlen是None,则脉冲响应的任何部分都被忽略。对于长信号,指定irlen可以显著改善滤波器的性能。(int型或None)

输出参数:
y:滤波后的数据数组


scipy.signal.butter(N, Wn, btype='low', analog=False, output='ba')

输入参数:
N:滤波器的阶数
Wn:归一化截止频率。计算公式Wn=2*截止频率/采样频率。(注意:根据采样定理,采样频率要大于两倍的信号本身最大的频率,才能还原信号。截止频率一定小于信号本身最大的频率,所以Wn一定在0和1之间)。当构造带通滤波器或者带阻滤波器时,Wn为长度为2的列表。
btype : 滤波器类型{‘lowpass’, ‘highpass’, ‘bandpass’, ‘bandstop’},
output : 输出类型{‘ba’, ‘zpk’, ‘sos’}

输出参数:
b,a: IIR滤波器的分子(b)和分母(a)多项式系数向量。output='ba'
z,p,k: IIR滤波器传递函数的零点、极点和系统增益. output= 'zpk'
sos: IIR滤波器的二阶截面表示。output= 'sos'

最后附上matlab实现代码

fs = 1000 ; %信号的采样频率
wp=[8 30]*2/fs; %通带边界频率 ,单位为rad/s
ws=[7 32]*2/fs; %阻带边界频率 ,单位为rad/s
Rp=1;           %通带最大波纹度 ,单位dB (不要太小)
Rs=30;          %表示阻带最小衰减,单位dB
[N,Wn]=buttord(wp,ws,Rp,Rs);%巴特沃斯数字滤波器的阶数n和-3dB归一化截止频率Wn

[B,A]=butter(N,Wn);%得到n阶巴特沃斯滤波的分子分母
dataOut = filter(B,A,dataIn);

你可能感兴趣的:(随笔,信号处理,算法,嵌入式)