FIR 滤波器设计

目录

线性相位滤波器


        与无限持续时间脉冲响应 (IIR) 滤波器相比,具有有限持续时间脉冲响应的数字滤波器(全零或 FIR 滤波器)既有优点又有缺点。

FIR 滤波器具有以下主要优点:

  • 它们可以具有精确的线性相位
  • 它们始终稳定
  • 设计方法通常是线性的
  • 它们可以在硬件中高效实现

滤波器启动瞬态具有有限持续时间。

        FIR 滤波器的主要缺点是,要达到同样的性能水平,其所需阶数远高于 IIR 滤波器。相应地,这些滤波器的延迟通常比同等性能的 IIR 滤波器大得多。

FIR 滤波器

滤波器设计方法

说明

滤波器函数

加窗

对指定的矩形滤波器的截断傅里叶逆变换应用加窗

fir1, fir2, kaiserord

多频带(包含过渡带)

对频率范围的子带使用等波纹或最小二乘方法

firls、firpm、firpmord

约束最小二乘

根据最大误差约束,在整个频率范围内最小化平方积分误差

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) = 0

III 类

偶数

奇数:

b(k)=−b(n+2−k), k=1,...,n+1

H(0) = 0

H(1) = 0

IV 类

奇数

奇数:

b(k)=−b(n+2−k), k=1,...,n+1

H(0) = 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;

        如图所示:

猜你喜欢

转载自blog.csdn.net/jk_101/article/details/123104130