学习笔记-滤波器的系数

时间:2024-04-12 17:22:22

滤波器系数的获得有三种方式,一是根据公式计算得出;二是使用MATLAB的FDAtool设计得到;三是使用MATLAB的函数得出。

(一)公式推算

无限冲激响应数字IIR滤波器的设计步骤:

(1)将数字滤波器的技术指标转换为模拟低通滤波器的技术指标;

(2)设计模拟低通滤波器G(s)

(3)将G(s)转换成H(z)

例如,设计低通滤波器,要求采样频率Fs=500Hz,fp=100Hz,在通带内最大衰减ap=3dB,在fs=120Hz最小衰减as=20dB。

第一步,①通过w= 2*pi*f/Fs将上述fpfs转换成wpws;②再通过omega= tan(w/2)转换成omegapomegas;③归一化lambdap =omegap/omegaplambdasomegas/omegap

第二步,得出所求滤波器的阶数N = lg(sqrt((10^(as/10)-1)/(10^(ap/10)-1)))/lg(lambdas),向上取整;

第三步,得到模拟低通滤波器的转移函数G(s):①首先归一化后的转移函数G(P)Pk=exp(j*(2K+N-1)*pi/(2N)),Gk(P)=1/(P^2-2P*cos((2K+N-1)*pi/(2N)));若N是偶数,G(P)=G1(P)*G2(P)*……*G(N/2)(P),是N/2个Gk(P)连乘;若N是奇数G(P)=(1/(P+1))*G1(P)*G2(P)*……*G((N-1)/2)(P),(N-1)/2Gk(P)连乘与一个一阶系统相级联;②去归一化,利用P=s/omegap,将G(P)转换成G(s)

第四步,使用双线性z变换法得到数字滤波器H(z):利用s=(z-1)/(z+1),将G(s)转换成H(z)

备注      如果是带通或者是高通等数字滤波器,在第一步的③归一化时,需要omegaBW = omega3-omega1,eta = omega/omegaBW;lambdap = 1;lambdas = abs(min(abs( etasl-eta1*eta3/etasl ),abs(etash-eta1*eta3/etash)));还有在第三步的②,去归一化,利用P=(s^2+omega1*omega3)/(s(omega3-omega1)),将G(P)转换成H(s)

(二)FDAtool设计

1、MATLAB命令输入fdatool,打开设计工具;学习笔记-滤波器的系数

学习笔记-滤波器的系数

2、设计数字IIR低通滤波器,设定阶数specify order为20阶,采样平率Fs为500Hz,Fc为100Hz。

学习笔记-滤波器的系数

3、点击design filter,

学习笔记-滤波器的系数

显示的是幅频响应magnitude response,可以变化一下显示界面,选择滤波器系数filter coefficients,

学习笔记-滤波器的系数

此时显示的系数是二阶级联情况下的系数,在Edit中选择转换convert to single section,

学习笔记-滤波器的系数

Z系统下的系数,numerator是分子系数,Denominator是分母系数,依次为z的0次方、z的-1次方、z的-2次方……。

4、保存系数。在targets下选择生成C的头文件generate C header...。

按照个人习惯命名变量,以单精度保存数据,generate。

学习笔记-滤波器的系数

5、按照H(Z)的系数与data计算得出滤波后的数据。


(三)MATLAB函数

fp=100;fs=120;Fs=500;
rp=3;rs=20;

wp=fp*2*pi/Fs;ws=fs*2*pi/Fs;
% Firstly to finish frequency prewarping;
[n,wn]=buttord(wp/pi,ws/pi,rp,rs);
n=20;
[bz,az]=butter(n,wp/pi);
%
[bz1,az1]=butter(n,wn);
%
[h,w]=freqz(bz,az,128,Fs);
[h1,w1]=freqz(bz1,az1,128,Fs);
plot(w,abs(h),w1,abs(h1),'g.');grid on;

上述数字低通滤波器,其中bz,az就是系数,n为阶数。