FIR 滤波器设计

目录

线性相位滤波器


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

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

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

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

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

FIR 滤波器

滤波器设计方法

说明

滤波器函数

加窗

扫描二维码关注公众号,回复: 14381687 查看本文章

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

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