目录
与无限持续时间脉冲响应 (IIR) 滤波器相比,具有有限持续时间脉冲响应的数字滤波器(全零或 FIR 滤波器)既有优点又有缺点。
FIR 滤波器具有以下主要优点:
- 它们可以具有精确的线性相位
- 它们始终稳定
- 设计方法通常是线性的
- 它们可以在硬件中高效实现
滤波器启动瞬态具有有限持续时间。
FIR 滤波器的主要缺点是,要达到同样的性能水平,其所需阶数远高于 IIR 滤波器。相应地,这些滤波器的延迟通常比同等性能的 IIR 滤波器大得多。
FIR 滤波器
滤波器设计方法 | 说明 | 滤波器函数 |
---|---|---|
加窗 | 对指定的矩形滤波器的截断傅里叶逆变换应用加窗 | fir1, fir2, kaiserord |
多频带(包含过渡带) | 对频率范围的子带使用等波纹或最小二乘方法 | |
约束最小二乘 | 根据最大误差约束,在整个频率范围内最小化平方积分误差 | fircls, fircls1 |
任意响应 | 任意响应,包括非线性相位和复滤波器 | cfirpm |
升余弦 | 具有平滑正弦过渡的低通响应 | rcosdesign |
线性相位滤波器
除 cfirpm 外,所有 FIR 滤波器设计函数都只设计线性相位滤波器。这些滤波器系数或“抽头”遵循偶数或奇数对称关系。根据这种对称性以及滤波器的阶数 n 是偶数还是奇数,线性相位滤波器(存储在长度为 n +1 的向量 b 中)对其频率响应有一定的固有限制。
线性相位滤波器类型 | 滤波器阶数 | 系数的对称性 | 响应 H(f)、f = 0 | 响应 H(f)、f = 1 (Nyquist) |
---|---|---|---|---|
I 类 | 偶数 | 偶数: b(k)=b(n+2−k), k=1,...,n+1 | 无限制 | 无限制 |
II 类 | 奇数 | 偶数: b(k)=b(n+2−k), k=1,...,n+1 | 无限制 | H(1) |
III 类 | 偶数 | 奇数: b(k)=−b(n+2−k), k=1,...,n+1 | H(0) | H(1) |
IV 类 | 奇数 | 奇数: b(k)=−b(n+2−k), k=1,...,n+1 | H(0) | 无限制 |
线性相位FIR滤波器的相位延迟和群延迟在整个频带内相等且恒定。对于n阶线性相位FIR滤波器,群延迟为n/2,滤波后的信号延迟n/2个时间步(其傅里叶变换的幅值按滤波器的幅值响应进行缩放)。该属性保持通带中信号的波形;也就是说,没有相位失真。
默认情况下,函数 fir1、fir2、firls、firpm、fircls 和 fircls1 都可用于设计 I 类和 II 类线性相位 FIR 滤波器。rcosdesign 只用于设计 I 类滤波器。在给定 'hilbert' 或 'differentiator' 标志的情况下,firls 和 firpm 都可用于设计 III 和 IV 类线性相位 FIR 滤波器。cfirpm 可用于设计任何类型的线性相位滤波器和非线性相位滤波器。
注意:由于 II 类滤波器在 Nyquist 频率(“高”频率)下的频率响应为零,fir1 不用于设计 II 类高通和带阻滤波器。在这些情况下,如果n为奇数值,fir1 将阶加 1,并返回 I 类滤波器。
加窗方法
假设一个截止频率为 ω0 弧度/秒的理想的矩形数字低通滤波器。该滤波器在幅值小于 ω0 的所有频率上都具有幅值 1,在幅值介于 ω0 和 π 之间的频率上具有幅值 0。其脉冲响应序列 h(n) 为:
该滤波器不可实现,因为它的脉冲响应是无限的和非因果的。要创建有限持续时间脉冲响应,请通过应用加窗来截断它。通过在此截断中保留脉冲响应的中心部分,可以获得线性相位 FIR 滤波器。例如,一个低通截止频率 ω0 为 0.4 π 弧度/秒的、长度为 51 的滤波器为:
b = 0.4*sinc(0.4*(-25:25));
此处应用的加窗是简单的矩形窗。根据 Parseval 定理,长度为 51 的滤波器在积分最小二乘意义上最接近理想的低通滤波器。以下命令在 FVTool 中显示滤波器的频率响应:
fvtool(b,1)
请注意,下图中显示的 y 轴采用幅值的二次方。可以通过右键点击轴标签并从菜单中选择幅值平方来进行此设置。如图所示:
响应中会出现振铃和波纹,尤其是在频带边缘附近。这种“吉布斯效应”不会随着滤波器长度的增加而消失,但非矩形窗会减小其幅值。在时域中将信号乘以一个窗函数会使信号在频域中发生卷积或平滑。将长度为 51 的 Hamming 窗应用于滤波器,并使用 FVTool 显示结果:
b = 0.4*sinc(0.4*(-25:25));
b = b.*hamming(51)';
fvtool(b,1)
请注意,下图中显示的 y 轴采用幅值的二次方。可以通过右键点击轴标签并从菜单中选择幅值平方来进行此设置。如图所示:
使用 Hamming 窗可以大大降低振铃。这一改善以过渡带宽度和最优性为代价:加窗的滤波器需要更长时间从通带下降到阻带,且无法最小化平方误差积分。
标准频带 FIR 滤波器设计:fir1
fir1 使用最小二乘逼近计算滤波器系数,然后通过加窗对脉冲响应进行平滑处理。有关加窗及其属性的概述,可以参考加窗法。fir1 类似于 IIR 滤波器的设计函数,因为它用于设计标准频带配置(低通、带通、高通和带阻)条件下的滤波器。以下语句:
n = 50;
Wn = 0.4;
b = fir1(n,Wn);
创建行向量 b,其中包含 n 阶 Hamming 窗滤波器的系数。这是一个低通线性相位 FIR 滤波器,截止频率为 Wn。Wn 是介于 0 和 1 之间的数字,其中 1 对应于 Nyquist 频率,即采样频率的一半。(与其他方法不同,此处 Wn 对应于 6 dB 点。)要获得高通滤波器,只需将 'high' 添加到函数的参数列表中。要获得带通或带阻滤波器,将 Wn 指定为包含通带边缘频率的二元素向量。为带阻配置追加 'stop'。
b = fir1(n,Wn,window) 使用列向量 window 中指定的窗口进行设计。向量 window 的长度必须为 n+1 个元素。如果未指定窗口,fir1 将应用 Hamming 窗。
Kaiser 窗阶估计. kaiserord 函数估计滤波器阶数、截止频率和 Kaiser 窗 β 参数,使之满足一组给定的滤波器设定。在给定频带边缘向量和对应的幅值向量以及最大允许波纹的情况下,kaiserord 为 fir1 函数返回适当的输入参数。
多频带 FIR 滤波器设计:fir2
fir2 函数还可用于设计加窗的 FIR 滤波器,但具有任意形状的分段线性频率响应。这与 fir1 不同,后者仅设计具有标准低通、高通、带通和带阻配置的滤波器。以下命令:
n = 50;
f = [0 .4 .5 1];
m = [1 1 0 0];
b = fir2(n,f,m);
返回行向量 b,其中包含 n 阶 FIR 滤波器的 n+1 个系数,其频率幅值特征与向量 f 和 m 给出的频率幅值特征相匹配。f 是频率点的向量,范围从 0 到 1,其中 1 代表 Nyquist 频率。m 是向量,包含 f 中指定点的指定幅值响应。(该函数的对应 IIR 函数是 yulewalk,后者还可基于任意分段线性幅值响应设计滤波器。)
参考代码:
作者:肥猫大师
链接:https://zhuanlan.zhihu.com/p/337397832
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
%% 原始信号
fs = 1000; % 采样频率
t = 0:1/fs:2-1/fs; % 时间
singal0 = sin(2*pi*1*t); % 未加噪声的信号
SNR = 15; % 信号信噪比
singal = awgn(singal0,SNR); % 在加入高斯白噪声
%% IIR滤波 (butterworth滤波器)
fstop = 20; % 低通截止频率
wn = fstop/(fs/2); % 归一化截止频率
N_IIR = 5; % IIR阶数
[b_iir,a_iir] = butter(N_IIR,wn) % IIR滤波器参数
singal_iir = filter(b_iir,a_iir,singal); %IIR滤波
%% FIR滤波 (hamming窗)
N_FIR = 15; % FIR阶数
b_fir = fir1(N_IIR,wn) % FIR滤波器参数
singal_fir = filter(b_fir,1,singal); %FIR滤波
%% 滑动平均 (平滑常数M=10;)
wsize = 10; % 平滑常数
b_avg = ones(1,wsize)/wsize; % 权值
singal_avg = filter(b_avg,1,singal); %滑动平均滤波
%% 输出比较
figure
subplot(2,2,1)
plot(t,singal)
title('\fontname{宋体}\fontsize{12}原始信号');
xlabel('\fontname{Arial}\fontsize{12}t');
ylabel('\fontname{Arial}\fontsize{12}singal');
grid on;
subplot(2,2,2)
plot(t,singal_iir)
title('\fontname{宋体}\fontsize{12}5阶IIR滤波');
xlabel('\fontname{Arial}\fontsize{12}t');
ylabel('\fontname{Arial}\fontsize{12}singal(iir)');
grid on;
subplot(2,2,3)
plot(t,singal_fir)
title('\fontname{宋体}\fontsize{12}15阶FIR滤波');
xlabel('\fontname{Arial}\fontsize{12}t');
ylabel('\fontname{Arial}\fontsize{12}singal(fir)');
grid on;
subplot(2,2,4)
plot(t,singal_avg)
title('\fontname{宋体}\fontsize{12}滑动平均(常数10)');
xlabel('\fontname{Arial}\fontsize{12}t');
ylabel('\fontname{Arial}\fontsize{12}singal(avg)');
grid on;
如图所示: