【Digital Filters】Detailed explanation on FIR Filter and IIR Filter

一、FIR and IIR

1、What are they?

根据冲激响应的区分,线性时不变(Linear Time Invariant,LTI )系统包括有限冲击响应(Finite Impulse Response,FIR)系统和无限冲激响应(Infinite Impulse Response)系统。依据上述系统的不同,设计的数字滤波器分别对应为FIR滤波器和IIR滤波器。

2、How to understand them?

数字滤波器的目的就是将输入序列通过一定的运算,变换成我们期望的输出序列。数字滤波器用硬件实现的基本单元包括延迟器、乘法器和加法器;而用软件实现时,它就是一段线性卷积。
IIR滤波器的单位冲击响应 h ( n ) h(n) h(n) 是无限长的,对于一个给定的线性时不变系统的系统函数,有着各种不同的等效差分方程或网络结构,如何采用最少常数乘法器和最少延迟器,以提高运算速度和减少存储器,并保证输出是我们期望的信号,这是IIR滤波器设计的关键依据。
FIR滤波器的单位冲击响应 h ( n ) h(n) h(n) 的长度是有限的,系统函数 H ( Z ) H(Z) H(Z) 在有限Z平面只有零点,极点全部位于 Z = 0 Z=0 Z=0 处。

IIR滤波器实现的基本结构有直接型、级联型和并联型;FIR滤波器实现的基本结构有直接型、级联型、频率采样型和快速卷积型。

3、How to design them?

设计工具

根据滤波器的设计指标,设计出来的数字滤波器实质就是一组系数(Filter Coefficients)。
除了利用MATLAB自带的函数来设计滤波器,还有一种更高效的方法,利用MATLAB信号处理工具箱中的FDATool(Filter Design & Analysis Tool),即滤波器设计和分析工具。
在这里插入图片描述
在MATLAB的命令窗口中输入fdatool(老版本)或者filterDesigner(新版本),即可出现如下图所示的窗口界面。
在这里插入图片描述
为便于表述,我将该界面分为6个功能区域,逐一进行讲解。
区域1:Current Filter Information,该区域给出了滤波器的基本信息,如结构、阶数、是否稳定等。
区域2:Filter Specifications,该区域主要描述滤波器的基本性能,如滤波器的理想特性、幅频特性、相频特性、零极点分布等。
区域3:Response Type & Design Method,该区域主要给定滤波器的响应特性和设计方法。前者包括低通、高通、带通、带阻等;后者主要包括IIR还是FIR的滤波器,以及对应的滤波器类型。
区域4:Filter Order,该区域主要给定滤波器的阶数和相应的选项。
区域5:Frequency Specifications,该区域主要给定滤波器的频率参数,如频率单位、采样率、通带频率、截止频率。
区域6:Magnitude Specifications,该区域主要给定滤波器的幅度参数,如幅度单位、通带纹波、阻带衰减。

设计实例

要求:设计一个50阶的低通数字滤波器,采用汉明窗函数,阻带截止频率为1000Hz,采样率为4000Hz。
根据要求在参数设置区域进行选择和输入即可,不同的设计要求,可供选择的参数也有差异,例如区域6的幅度特性无法再进行设置(截止频率的衰减为固定值6dB)。参数设置完毕后,单击Design Filter按钮即可自动完成滤波器的设计工作。
在这里插入图片描述
还可以单击View查看窗函数的具体情况。
在这里插入图片描述
单击Analysis下拉菜单,可以对滤波器的各种特性进行分析和比较,如幅频特性、相频特性、单位阶跃响应和零极点分布。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
根据指标要求设计好滤波器后,如何得到滤波器的系数呢?
单击File→Export下拉菜单,有四种方式可以将设计好的滤波器系数导出。
在这里插入图片描述
方式一:选择Export To Workspace,则将滤波器系数以数组的形式存储到MATLAB的工作空间Workspace里

方式二:选择Export To Coefficient File(ASCII),则MATLAB将会生成一个后缀为fcf的文件,该文件相当于滤波器设计报告,详细描述了如下面所示的信息。

% Generated by MATLAB(R) 9.4 and Signal Processing Toolbox 8.0.
% Generated on: 03-Jun-2023 16:02:43

% Coefficient Format: Decimal

% Discrete-Time FIR Filter (real)         
% -------------------------------         
% Filter Structure  : Direct-Form FIR     
% Filter Length     : 51                  
% Stable            : Yes                 
% Linear Phase      : Yes (Type 1)        

                                         
Numerator:                                
 0.001018591635788130373915794102401832788
-0.000000000000000001629966706229630172644
-0.001307170629616836174738403464345992688
 0.00000000000000000796156926841549797783 
 0.002075061044252020456962748440332688915
-0.000000000000000003271583250947930852754
-0.003428941839960932425751538588087896642
 0.000000000000000004810050990718253697259
 0.005495894948365394327982613731364835985
-0.000000000000000006707614012929567114586
-0.008442685530493836479348779278097936185
 0.00000000000000000884504145414770879705 
 0.012514876207833876275987705639636260457
-0.000000000000000011088030887332696249213
-0.018120380727442958468387246284692082554
 0.00000000000000001329564703725941715509 
 0.026025669682721547237846948519290890545
-0.000000000000000015329177262183712470151
-0.037888654721142805970046651964366901666
 0.000000000000000017060847379272565362137
 0.058069133588671648094070576462399912998
-0.000000000000000018381850186432094529674
-0.102675860114331968242495918275380972773
 0.000000000000000019209182218979988572104
 0.31715530066131841779863975716580171138 
 0.5                                      
 0.31715530066131841779863975716580171138 
 0.000000000000000019209182218979988572104
-0.102675860114331968242495918275380972773
-0.000000000000000018381850186432094529674
 0.058069133588671648094070576462399912998
 0.000000000000000017060847379272565362137
-0.037888654721142805970046651964366901666
-0.000000000000000015329177262183712470151
 0.026025669682721547237846948519290890545
 0.00000000000000001329564703725941715509 
-0.018120380727442958468387246284692082554
-0.000000000000000011088030887332696249213
 0.012514876207833876275987705639636260457
 0.00000000000000000884504145414770879705 
-0.008442685530493836479348779278097936185
-0.000000000000000006707614012929567114586
 0.005495894948365394327982613731364835985
 0.000000000000000004810050990718253697259
-0.003428941839960932425751538588087896642
-0.000000000000000003271583250947930852754
 0.002075061044252020456962748440332688915
 0.00000000000000000796156926841549797783 
-0.001307170629616836174738403464345992688
-0.000000000000000001629966706229630172644
 0.001018591635788130373915794102401832788

方式三:选择Export To MAT-File,将滤波器系数存储为后缀为mat的MATLAB数据文件。
方式四:选择Export To SPTool,则将滤波器系数存储为供信号处理工具软件SPTool使用的数据格式。

以上就是关于滤波器设计工具箱的使用方法,由于选择的参数较多,需要设计者根据实际情况合理选择适合的参数。下面将介绍如何利用滤波器系数对输入信号进行滤波,以得到我们期望的输出信号。

4、How to use them?

假设我们有一个信号 x ( t ) x(t) x(t),其表达式为:
x ( t ) = x 1 ( t ) + x 2 ( t ) ; x(t)=x_{1}(t)+x_{2}(t); x(t)=x1(t)+x2(t)
x 1 ( t ) = 3 s i n ( 2 π f 1 t ) ; x 2 ( t ) = 5 s i n ( 2 π f 2 t ) x_{1}(t)=3sin(2πf_{1}t);x_{2}(t)=5sin(2πf_{2}t) x1(t)=3sin(2πf1t)x2(t)=5sin(2πf2t)
其中, t ∈ ( 0 , 1 ) , f 1 = 500 H z , f 2 = 1200 H z t∈(0,1),f_{1}=500Hz,f_{2}=1200Hz t(0,1)f1=500Hzf2=1200Hz
信号 x ( t ) x(t) x(t)由两种频率分量的信号叠加而成,此时我们只想得到频率为500Hz的信号,可以采用滤波器对信号进行滤波处理,即利用低通滤波器将信号中频率较高的部分剔除,保留频率较高的部分。
回顾上一节中的内容,选择方式三:Export To MAT-File,将滤波器系数存储为Hn.mat的MATLAB数据文件。接下来将在MATLAB程序中使用该系数对输入信号 x ( t ) x(t) x(t) 进行滤波。

clc;
clear;
close all;

%% 信号仿真及滤波
load Hn;    % 将保存在本地的mat文件导入matlab工作区
f1 =  500;
f2 = 1200;
fs = 4000;
t = (0:1/fs:(1-1/fs));
x1 = 3*sin(2*pi*f1*t);
x2 = 5*sin(2*pi*f2*t);
x = x1+x2;

y = conv(x,Hn,'same');  % 卷积后的输出信号y的长度默认为length(x)+length(Hn)-1,
                        % 使用参数same,可保证输出信号的长度与输入信号相等。
                        
%% 画图
% 时域
figure;
subplot(3,1,1);plot(t,x1);xlabel('时间');ylabel('幅度');title('x1');
subplot(3,1,2);plot(t,x2);xlabel('时间');ylabel('幅度');title('x2');
subplot(3,1,3);plot(t,x);xlabel('时间');ylabel('幅度');title('x');

figure;
plot(Hn);xlabel('滤波器系数长度');ylabel('幅度');title('Hn');
figure;
plot(t,y);xlabel('时间');ylabel('幅度');title('y');

% 频域
[f,A1] = PinPu(x1,fs);
[~,A2] = PinPu(x2,fs);
[~,Ax] = PinPu(x,fs);
[~,Ay] = PinPu(y,fs);

figure;
subplot(2,2,1);plot(f,A1);xlabel('频率');ylabel('幅度');title('x1');
subplot(2,2,2);plot(f,A2);xlabel('频率');ylabel('幅度');title('x2');
subplot(2,2,3);plot(f,Ax);xlabel('频率');ylabel('幅度');title('x');
subplot(2,2,4);plot(f,Ay);xlabel('频率');ylabel('幅度');title('y');

二、summary

1、Compare their differences

性能方面

IIR滤波器可以用较低的阶数获得高的选择性,所用的存储单元少,经济效益高,但是它的相位是非线性的;
FIR滤波器需要用较高的阶数来达到高的选择性,对于相同的滤波器设计指标,FIR滤波器所需的阶数比IIR滤波器的阶数高5~10倍,所以成本较高,信号延时也较大。

结构方面

IIR滤波器必须采用递归结构,极点位置必须在单位圆内以保证系统的稳定性。由于运算过程中对序列进行舍入处理,其有限字长效应会使得误差不断积累,易产生寄生振荡。
FIR滤波器采用非递归结构,不存在稳定性问题,运算误差较小。FIR滤波器由于可以采用FFT算法来实现,因此在相同阶数下的运算速度快很多。

设计方法方面

FIR滤波器的设计:通过设计一个数字滤波器去逼近一个理想的低通滤波器,通常采用 窗函数法
IIR滤波器的设计:根据所要设计滤波器的参数去确定一个模拟滤波器的传输函数,然后再根据这个传输函数,通过 双线性变换法 或者 脉冲响应不变法 来进行数字滤波器的设计。

2、Filter selection

IIR滤波器和FIR滤波器各有所长,在实际应用时需要从经济成本、实现的难以程度、使用场合等多方面考虑来加以选择。例如对线性相位要求较高的场合,采用FIR滤波器较好;而对于相位要求不敏感的场合,选择IIR滤波器更合适。

3、Examples of different filter design methods

IIR滤波器

分别利用冲激响应不变法和双线性变换法设计IIR低通滤波器,对信号 x ( t ) = 5 s i n ( 2 π ∗ 100 ∗ t ) + 2 c o s ( 2 π ∗ 150 ∗ t ) x(t)=5sin(2π*100*t)+2cos(2π*150*t) x(t)=5sin(2π100t)+2cos(2π150t) 进行滤波。
要求:以小于1dB的衰减通过100Hz信号,以大于40dB的衰减抑制150Hz的信号。

clc;
clear;
close all;

%% 分别利用冲激响应不变法和双线性变换法设计IIR数字滤波器
Fs = 1000;      % 采样频率
wp = 2*pi*100;
ws = 2*pi*150;
rp = 1;
rs = 40;
[N,Wn] = cheb1ord(wp,ws,rp,rs,'s');     % 计算滤波器最小阶数和频带起始频率
[z,p,k] = cheb1ap(N,rp);                % 计算零点、极点、增益
[A,B,C,D] = zp2ss(z,p,k);
[At,Bt,Ct,Dt] = lp2lp(A,B,C,D,Wn);      % 频带转换:模拟低通滤波器转换为实际的模拟低通滤波器
[num1,den1] = ss2tf(At,Bt,Ct,Dt);

% 冲激响应不变法
[num2,den2] = impinvar(num1,den1,Fs);
[H1,W1] = freqz(num2,den2);
phase_H1 = phasez(num2,den2);

% 双线性变换法
[b,a] = bilinear(num1,den1,Fs);
[H2,W2] = freqz(b,a);
phase_H2 = phasez(b,a);

% 画图
figure;
plot(W1/pi,mag2db(abs(H1)),'r--');xlabel('归一化频率');ylabel('幅度(dB)');title('幅频响应');
hold on;
plot(W2/pi,mag2db(abs(H2)),'b-');xlabel('归一化频率');ylabel('幅度(dB)');title('幅频响应');
legend('冲激响应不变法','双线性变换法');

figure;
plot(W1/pi,phase_H1*180/pi,'r--');xlabel('归一化频率');ylabel('相位(degrees)');title('相频响应');
hold on;
plot(W2/pi,phase_H2*180/pi,'b-');xlabel('归一化频率');ylabel('相位(degrees)');title('相频响应');
legend('冲激响应不变法','双线性变换法');

IIR滤波器幅频响应曲线
IIR滤波器相频响应曲线

FIR滤波器

分别利用频率采样法和窗函数法设计一个阶数为20的FIR低通滤波器,要求指标如下:
通带截止频率: w p = 0.3 π w_{p}=0.3π wp=0.3π,通带纹波: A p = 5 d B A_{p}=5dB Ap=5dB
阻带起始频率: w r = 0.4 π w_{r}=0.4π wr=0.4π,阻带衰减: A r = 20 d B A_{r}=20dB Ar=20dB
采样频率: w s = 2.1 π w_{s}=2.1π ws=2.1π

clc;
clear;
close all;

%% 分别利用频率采样法和窗函数法设计FIR数字滤波器
N = 21;     % 滤波器的长度

% 频率采样法
Hk = [ones(1,4),zeros(1,13),ones(1,4)];
k1 = 0:floor((N-1)/2);
k2 = floor((N-1)/2)+1:N-1;
alpha = (N-1)/2;
angH = [-alpha*2*pi*k1/N,alpha*2*pi*(N-k2)/N];
H = Hk.*exp(1j*angH);
h1 = real(ifft(H));
[H1,W1] = freqz(h1);
phase_H1 = phasez(h1);   % 滤波器的相频响应,输出的相位单位为rad

% 窗函数法
wp = 0.3*pi;            % 通带截止频率
wr = 0.4*pi;            % 阻带起始频率
tr_width = wr-wp;       % 过渡带宽度
wc = (wp+wr)/2;         % 理想低通滤波器的截止频率

% 理想低通滤波器的单位脉冲响应
hd = ideal_lpf(wc,N);

w_hann = hanning(N);    % 产生汉宁窗系数
h2 = hd.*w_hann';
[H2,W2] = freqz(h2);    % 滤波器的幅频响应
phase_H2 = phasez(h2);   % 滤波器的相频响应,输出的相位单位为rad

% 画图
figure;
plot(W1/pi,mag2db(abs(H1)),'r--');xlabel('归一化频率');ylabel('幅度(dB)');title('幅频响应');
hold on;
plot(W2/pi,mag2db(abs(H2)),'b-');xlabel('归一化频率');ylabel('幅度(dB)');title('幅频响应');
legend('频率采样法','窗函数法');

figure;
plot(W1/pi,phase_H1*180/pi,'r--');xlabel('归一化频率');ylabel('相位(degrees)');title('相频响应');
hold on;
plot(W2/pi,phase_H2*180/pi,'b-');xlabel('归一化频率');ylabel('相位(degrees)');title('相频响应');
legend('频率采样法','窗函数法');
function hd = ideal_lpf(wc,N)
% 计算理想低通滤波器的单位脉冲响应
alpha = (N-1)/2;
n = 0:N-1;
m = n-alpha+eps;
hd = sin(wc*m)./(pi*m);
end

FIR滤波器的幅频响应和相频响应曲线如下:
FIR滤波器幅频响应曲线
FIR滤波器相频响应曲线

三、Reference

[1] FIR滤波器和IIR滤波器的区别与联系
[2] 手把手教系列之FIR滤波器设计
[3] 手把手教系列之IIR数字滤波器设计实现
[4] 沈再阳. MATLAB信号处理[M]. 北京: 清华大学出版社, 2017.
[5] 许可, 万建伟, 王玲. 信号处理仿真实验[M]. 北京: 清华大学出版社, 2018.

猜你喜欢

转载自blog.csdn.net/weixin_45317919/article/details/127468345