数字信号处理——巴特沃斯滤波器设计

设计思路

这里采用间接法设计数字滤波器(先设计模拟滤波器再设计数字滤波器)

滤波器理解:
1.数字滤波器可以用H(z),h(n)or系统差分方程来表示,对应的就是一个系统,信号输入该系统即可改变其所含频率成分的相对比例。
2.理想滤波器为什么无法实现?解:因为理想滤波器非因果,输出会在输入前产生,物理没法实现。(即理想滤波器对应时域无穷宽,在-∞时刻也会出现值,这是不可能的)
3.实际的信号滤波过程,在时域上进行,运用差分方程,实时输出信号。

间接法设计步骤:
1.设计模拟滤波器
1.1根据给定指标wp,ws,ap,as,算出巴特沃斯滤波器的阶数N以及wc(注意区分通带富余和阻带富余)
1.2查表得到G§的表达式
1.3将s=wc*p代入G§,得到H(s)的表达式
2.将模拟滤波器转换为数字滤波器
(转换的原因,离散信号是对模拟信号采样,然后序列化后得到的信号,故数字域的频率和模拟域的频率会存在一定的转换关系)
2.1脉冲响应不变法,模拟s域每2π/T为一个周期,都会映射到z域的单位圆,所以会出现频率混叠,但是数字域的频率w与模拟域的频率Ω是线性的关系,即w=Ω×T
2.2双线性变换法,将整个模拟频率轴压缩到±π/T,再映射到z域的单位圆上,故不会发生频率混叠,但是由于是非线性关系,数字域的频响曲线不能保真地模仿模拟域的频响曲线,会有一定失真

代码实现

两种办法设计滤波器(matlab在设计巴特沃斯滤波器时默认使用双线性变换)
1.直接数字滤波器
注:这里要对数字频率进行归一化(除fs/2)

fs=10000;
ap=3;
as=60;
wp_d=400/(fs/2);
ws_d=1500/(fs/2);
%设计巴特沃斯滤波器(数字)
[N_d,wc_d]=buttord(wp_d,ws_d,ap,as);
[b_d,a_d]=butter(N_d,wc_d);
figure;
freqz(b_d,a_d);

2.先设计模拟滤波器,然后再转换为数字滤波器
注:这里需要做“预畸变校正”,因为想要滤去的数字频率与对应的模拟频率是一个非线性关系。还有就是模拟频响函数为freqs。。。

wp_s=2*fs*(tan(pi/2*400/(fs/2)));
ws_s=2*fs*(tan(pi/2*1500/(fs/2)));
%设计巴特沃斯滤波器(模拟)
[N_s,wc_s]=buttord(wp_s,ws_s,ap,as,'s');
[b_s,a_s]=butter(N_s,wc_s,'s');
[n,d]=bilinear(b_s,a_s,fs);
freqz(n,d);

在这里插入图片描述
利用这个滤波器去对双频信号滤波,效果还不错

%生成信号
t=0:1/fs:0.2-1/fs;
f=sin(200*2*pi*t)+sin(1700*2*pi*t);
figure;
subplot(221);
plot(t,f);title('时域');axis([0 0.2 -2 2]);
F=fft(f);
fre=0:5:fs-5;
subplot(222);
plot(fre,abs(F));title('频域');

%滤波
res=filter(b_d,a_d,f);
subplot(223);
plot(t,res);title('滤波结果 时域');axis([0 0.2 -2 2]);
Res_F=fft(res);
subplot(224);
plot(fre,abs(Res_F));title('滤波结果 频域');

在这里插入图片描述

思考

如何解释使用使用带通滤波器却出现缓慢上升的现象?即下图
在这里插入图片描述
分析:
首先看到这个时域波形,我就觉得应该是h(n)在开头卷积的时候没有完全进入导致的,回来研究了下,大概可以解释这个现象了。

解:
原因在于在设计带通滤波器时,阻带边界频率与通带边界频率相差太短,故此时过渡带下降过快,对应时域的单位脉冲响应波形就会很宽,即这样:
在这里插入图片描述
所以在时域卷积时,反折平移,整个h(n)要花一定的时间才能进入,才会有了上图开头部分的缓慢上升现象。
如果把过渡带拉大,单位脉冲响应就会变窄,即:
在这里插入图片描述
得到的输出就好就不会出现上述情况,但是为了效果滤去的频率是不同的:
在这里插入图片描述

发布了99 篇原创文章 · 获赞 29 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44586750/article/details/103669117