欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-08 18:39:35
...

设计思路

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

滤波器理解:
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('滤波结果 频域');

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

相关标签: 数字信号处理