本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

FIR 滤波器设计

FIR 滤波器与 IIR 滤波器的比较

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

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

  • 它们可以具有精确的线性相位。

  • 它们始终稳定。

  • 设计方法通常是线性的。

  • 它们可以在硬件中高效实现。

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

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

FIR 滤波器概述

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+2k),k=1,...,n+1

无限制

无限制

II 类

奇数

偶数:

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

无限制

H(1) = 0

III 类

偶数

奇数:

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

H(0) = 0

H(1) = 0

IV 类

奇数

奇数:

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

H(0) = 0

无限制

线性相位 FIR 滤波器的相位延迟和群延迟在整个频带内相等且恒定。对于 n 阶线性相位 FIR 滤波器,群延迟为 n/2,滤波后的信号延迟 n/2 个时间步(其傅里叶变换的幅值按滤波器的幅值响应进行缩放)。该属性保持通带中信号的波形;也就是说,没有相位失真。

默认情况下,函数 fir1fir2firlsfirpmfirclsfircls1 都可用于设计 I 类和 II 类线性相位 FIR 滤波器。rcosdesign 只用于设计 I 类滤波器。在给定 'hilbert''differentiator' 标志的情况下,firlsfirpm 都可用于设计 III 和 IV 类线性相位 FIR 滤波器。cfirpm 可用于设计任何类型的线性相位滤波器和非线性相位滤波器。

注意

由于 II 类滤波器在 Nyquist 频率(“高”频率)下的频率响应为零,fir1 不用于设计 II 类高通和带阻滤波器。在这些情况下,如果 n 为奇数值,fir1 将阶加 1,并返回 I 类滤波器。

加窗方法

假设一个截止频率为 ω0 弧度/秒的理想的矩形数字低通滤波器。该滤波器在幅值小于 ω0 的所有频率上都具有幅值 1,在幅值介于 ω0 和 π 之间的频率上具有幅值 0。其脉冲响应序列 h(n) 为

h(n)=12πππH(ω)ejωndω=12πω0ω0ejωndω=sinω0nπn

该滤波器不可实现,因为它的脉冲响应是无限的和非因果的。要创建有限持续时间脉冲响应,请通过应用加窗来截断它。通过在此截断中保留脉冲响应的中心部分,可以获得线性相位 FIR 滤波器。例如,一个低通截止频率 ω0 为 0.4 π 弧度/秒的、长度为 51 的滤波器为

b = 0.4*sinc(0.4*(-25:25));

此处应用的加窗是简单的矩形窗。根据 Parseval 定理,长度为 51 的滤波器在积分最小二乘意义上最接近理想的低通滤波器。以下命令在 FVTool 中显示滤波器的频率响应:

fvtool(b,1)

请注意,下图中显示的 y 轴采用幅值的二次方。您可以通过右键点击轴标签并从菜单中选择 Magnitude Squared 来进行此设置。

响应中会出现振铃和波纹,尤其是在频带边缘附近。这种“吉布斯效应”不会随着滤波器长度的增加而消失,但非矩形窗会减小其幅值。在时域中将信号乘以一个窗函数会使信号在频域中发生卷积或平滑。将长度为 51 的 Hamming 窗应用于滤波器,并使用 FVTool 显示结果:

b = 0.4*sinc(0.4*(-25:25));
b = b.*hamming(51)';
fvtool(b,1)

请注意,下图中显示的 y 轴采用幅值的二次方。您可以通过右键点击轴标签并从菜单中选择 Magnitude Squared 来设置。

使用 Hamming 窗可以大大降低振铃。这一改善以过渡带宽度和最优性为代价:加窗的滤波器需要更长时间从通带下降到阻带,且无法最小化平方误差积分。

函数 fir1fir2 基于此加窗过程。对于给定的理想滤波器阶数和描述,这些函数返回该理想滤波器的加窗逆傅里叶变换。默认情况下,两者都使用 Hamming 窗,但它们接受任何窗函数。有关窗口及其属性的概述,请参阅加窗法

标准频带 FIR 滤波器设计:fir1

fir1 实现加窗的线性相位 FIR 数字滤波器设计的经典方法。它类似于 IIR 滤波器的设计函数,因为它用于设计标准频带配置(低通、带通、高通和带阻)条件下的滤波器。

以下语句

n = 50;
Wn = 0.4;
b = fir1(n,Wn);

创建行向量 b,其中包含 n 阶 Hamming 窗滤波器的系数。这是一个低通线性相位 FIR 滤波器,截止频率为 WnWn 是介于 0 和 1 之间的数字,其中 1 对应于 Nyquist 频率,即采样频率的一半。(与其他方法不同,此处 Wn 对应于 6 dB 点。)要获得高通滤波器,只需将 'high' 添加到函数的参数列表中。要获得带通或带阻滤波器,请将 Wn 指定为包含通带边缘频率的二元素向量。为带阻配置追加 'stop'

b = fir1(n,Wn,window) 使用列向量 window 中指定的窗口进行设计。向量 window 的长度必须为 n+1 个元素。如果未指定窗口,fir1 将应用 Hamming 窗。

Kaiser 窗阶估计.  kaiserord 函数估计滤波器阶数、截止频率和 Kaiser 窗 β 参数,使之满足一组给定的滤波器设定。在给定频带边缘向量和对应的幅值向量以及最大允许波纹的情况下,kaiserordfir1 函数返回适当的输入参数。

多频带 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 个系数,其频率幅值特征与向量 fm 给出的频率幅值特征相匹配。f 是频率点的向量,范围从 0 到 1,其中 1 代表 Nyquist 频率。m 是向量,包含 f 中指定点的指定幅值响应。(该函数的对应 IIR 函数是 yulewalk,后者还可基于任意分段线性幅值响应设计滤波器。有关详细信息,请参阅 IIR 滤波器设计。)

具有过渡带的多频带 FIR 滤波器设计

fir1fir2 函数相比,firlsfirpm 函数提供更通用的指定理想滤波器的方法。这些函数用于设计 Hilbert 变换器、微分器和其他具有奇数对称系数(III 类和 IV 类线性相位)的滤波器。它们还允许您包括误差没有最小化的过渡或“不重要”区域,并执行最小化的频带相关加权。

firls 函数是 fir1fir2 函数的扩展,它用于最小化指定频率响应和实际频率响应之间误差平方的积分。

firpm 函数实现 Parks-McClellan 算法,该算法使用 Remez 交换算法和 Chebyshev 逼近理论来设计在指定频率响应和实际频率响应之间具有最佳拟合的滤波器。这种滤波器可最小化指定频率响应和实际频率响应之间的最大误差,从这种意义上而言,它们是最优的滤波器;它们有时被称为 minimax 滤波器。以这种方式设计的滤波器在频率响应方面表现出等波纹特性,因此也称为等波纹滤波器。Parks-McClellan FIR 滤波器设计算法可能是最流行和最广泛使用的 FIR 滤波器设计方法。

firlsfirpm 的语法相同;唯一的区别体现在最小化方案上。下一个示例说明用 firlsfirpm 设计的滤波器如何反映这些不同方案。

基本配置

firlsfirpm 的默认操作模式是设计 I 类或 II 类线性相位滤波器,具体取决于您所需的阶是偶数还是奇数。以下低通示例在 0 到 0.4 Hz 逼近幅值 1,在 0.5 到 1.0 Hz 逼近幅值 0:

n = 20;                    % Filter order
f = [0 0.4 0.5 1];         % Frequency band edges
a = [1  1  0 0];           % Amplitudes
b = firpm(n,f,a);

从 0.4 Hz 到 0.5 Hz,firpm 不执行误差最小化;这是一个过渡带或“不重要”区域。过渡带将您关心的频带中的误差降至最低,但代价是过渡速率变慢。在这种方式下,这些类型的滤波器具有固有折衷,类似于加窗的 FIR 设计。

要将最小二乘与等波纹滤波器设计进行比较,请使用 firls 创建一个类似的滤波器。键入

bb = firls(n,f,a);

并使用 FVTool 比较其频率响应:

fvtool(b,1,bb,1)

请注意,下图中显示的 y 轴采用幅值的二次方。您可以通过右键点击轴标签并从菜单中选择 Magnitude Squared 来设置。

使用 firpm 设计的滤波器表现出等波纹行为。另请注意,firls 滤波器在大部分通带和阻带上都有更好的响应,但在频带边缘(f = 0.4f = 0.5)处,响应不如 firpm 滤波器的响应理想。这表明,firpm 滤波器在通带和阻带上的最大误差较小,事实上,对于该频带边缘配置和滤波器长度来说,这是可能的最小值。

可以将频带视为短频率间隔内的线。firpmfirls 使用此方案来表示具有任何过渡带的任何分段线性频率响应函数。firlsfirpm 用于设计低通、高通、带通和带阻滤波器;以下是一个带通示例

f = [0 0.3  0.4  0.7  0.8  1];   % Band edges in pairs
a = [0  0    1    1    0   0];   % Bandpass filter amplitude

从技术上讲,这些 fa 向量定义五个频带:

  • 两个阻带,从 0.0 到 0.3 和从 0.8 到 1.0

  • 一个通带,从 0.4 到 0.7

  • 两个过渡带,从 0.3 到 0.4 和从 0.7 到 0.8

以下为高通和带阻滤波器的示例

f = [0 0.7  0.8  1];            % Band edges in pairs
a = [0  0    1   1];            % Highpass filter amplitude
f = [0 0.3  0.4  0.5  0.8  1];  % Band edges in pairs
a = [1  1    0    0    1   1];  % Bandstop filter amplitude

以下是多频带带通滤波器的示例

f = [0 0.1 0.15 0.25 0.3 0.4 0.45 0.55 0.6 0.7 0.75 0.85 0.9 1];
a = [1  1   0    0    1   1   0    0    1   1   0    0    1  1];

另一种可能的滤波器具有连接通带和阻带的线作为过渡区域;这有助于控制宽过渡区域的“失控”幅值响应:

f = [0 0.4 0.42 0.48 0.5  1];
a = [1 1 0.8 0.2 0 0];   % Passband, linear transition, 
                         %  stopband

权重向量

firlsfirpm 都允许您有所侧重地将某些频带的误差降至最低。为此,请在频率和幅值向量后指定权重向量。在以下低通等波纹滤波器示例中,阻带中的波纹比通带中的小 10 倍

n = 20;              % Filter order
f = [0 0.4 0.5 1];   % Frequency band edges
a = [1  1   0  0];   % Amplitudes
w = [1 10];          % Weight vector
b = firpm(n,f,a,w);

合法权重向量始终是 fa 向量长度的一半;每个频带只能有一个对应权重。

反对称滤波器/Hilbert 变换器

当用尾部 'h''Hilbert' 选项调用时,firpmfirls 会设计奇对称的 FIR 滤波器,即 III 类(偶数阶)或 IV 类(奇数阶)线性相位滤波器。理想的 Hilbert 变换器具有这种反对称属性,且在整个频率范围内幅值为 1。尝试以下逼近 Hilbert 变换器,并使用 FVTool 对其绘图:

b = firpm(21,[0.05 1],[1 1],'h');       % Highpass Hilbert
bb = firpm(20,[0.05 0.95],[1 1],'h');   % Bandpass Hilbert
fvtool(b,1,bb,1)

通过这些滤波器,您可以求得信号 x 的延迟 Hilbert 变换。

fs = 1000;            % Sampling frequency
t = (0:1/fs:2)';      % Two second time vector
x = sin(2*pi*300*t);  % 300 Hz sine wave example signal
xh = filter(bb,1,x);  % Hilbert transform of x

对应于 x 的分析信号是以 x 为实部、以 x 的 Hilbert 变换为虚部的复信号。对于这种 FIR 方法(hilbert 函数的替代方法),您必须将 x 延迟一半滤波器阶数才能创建分析信号:

xd = [zeros(10,1); x(1:length(x)-10)];	    % Delay 10 samples
xa = xd + j*xh;                            % Analytic signal

这种方法不能直接用于奇数阶滤波器,因为奇数阶滤波器需要非整数延迟。在这种情况下,Hilbert 变换中所述的 hilbert 函数可估算解析信号。或者,使用 resample 函数将信号延迟非整数个样本。

微分器

信号在时域中的微分等效于信号的傅里叶变换乘以虚斜坡函数。也就是说,要对信号求导,请将其传递给具有响应 H(ω) =  jω 的滤波器。使用 firpmfirls'd''differentiator' 选项逼近理想的微分器(有延迟):

b = firpm(21,[0 1],[0 pi],'d');

对于 III 类滤波器,微分频带不应超过 Nyquist 频率,幅值向量必须反映此变化,以确保斜率正确:

bb = firpm(20,[0 0.9],[0 0.9*pi],'d');

'd' 模式下,firpm 在非零幅值频带中对误差加权 1/ω,以最小化最大相对误差。在 'd' 模式下,firls 在非零幅值频带中对误差加权 (1/ω)2

下图显示上述微分器的幅值响应。

fvtool(b,1,bb,1)
legend('Odd order','Even order','Location','best')

约束最小二乘 FIR 滤波器设计

使用约束最小二乘 (CLS) FIR 滤波器设计函数时,您无需显式定义幅值响应过渡带即可设计 FIR 滤波器。省略过渡带设定的功能在很多情况下都很有用。例如,如果噪声和信号信息一起出现在同一个频带中,可能不清楚严格定义的过渡带应该出现在哪里。同样,如果过渡带的出现仅仅是为了控制滤波器响应中出现的吉布斯现象的结果,则可以省略过渡带设定。有关这种方法的讨论,请参阅 Selesnick、Lang 和 Burrus·[2]

对于您指定的响应,CLS 方法不定义通带、阻带和过渡区域,而是接受截止频率(对于高通、低通、带通或带阻情况)或者通带和阻带边缘(对于多频带情况)。通过这种方式,CLS 方法可以隐式(而不是显式)定义过渡区域。

CLS 方法的主要特点是它使您能够定义上阈值和下阈值,其中包含幅值响应中允许的最大波纹。在给定此约束的情况下,该方法在滤波器响应的频率范围内(而不是在特定频带上)应用最小二乘误差最小化方法。误差最小化包括理想的矩形响应中的任何不连续区域。另一个好处是,该方法使您能够指定吉布斯现象产生的任意小的峰值。

有两个工具箱函数可实现这种设计方法。

说明

函数

约束最小二乘多频带 FIR 滤波器设计

fircls

低通和高通线性相位滤波器的约束最小二乘滤波器设计

fircls1

有关这些函数的调用语法的详细信息,请参阅函数参考中相应的参考说明。

基本低通和高通 CLS 滤波器设计

最基本的 CLS 设计函数 fircls1 使用这种方法设计低通和高通 FIR 滤波器。例如,假设您要设计一个 61 阶脉冲响应滤波器,其截止频率为 0.3(归一化形式)。此外,还需要将约束设计过程的上限和下限定义为:

  • 与 1 的最大通带偏差(通带波纹)为 0.02。

  • 与 0 的最大阻带偏差(阻带波纹)为 0.008。

要使用 fircls1 逼近此设计问题,请使用以下命令:

n = 61;
wo = 0.3;
dp = 0.02;	
ds = 0.008;
h = fircls1(n,wo,dp,ds);
fvtool(h,1)

请注意,下面显示的 y 轴以幅值平方表示。您可以通过右键点击轴标签并从菜单中选择 Magnitude Squared 来设置。

多频带 CLS 滤波器设计

fircls 使用相同的方法设计具有指定分段常量幅值响应的 FIR 滤波器。在本例中,您可以指定频带边缘的向量和对应的频带幅值向量。此外,您可以指定每个频带的最大波纹量。

例如,假设滤波器调用的设定为:

  • 从 0 到 0.3(归一化):幅值 0,上限 0.005,下限 –0.005

  • 从 0.3 到 0.5:幅值 0.5,上限 0.51,下限 0.49

  • 从 0.5 到 0.7:幅值 0,上限 0.03,下限 –0.03

  • 从 0.7 到 0.9:幅值 1,上限 1.02,下限 0.98

  • 从 0.9 到 1:幅值 0,上限 0.05,下限 –0.05

设计一个脉冲响应阶数为 129 的 CLS 滤波器,满足以下设定:

n = 129;
f = [0 0.3 0.5 0.7 0.9 1];
a = [0 0.5 0 1 0];
up = [0.005 0.51 0.03 1.02 0.05];
lo = [-0.005 0.49 -0.03 0.98 -0.05];
h = fircls(n,f,a,up,lo);
fvtool(h,1)

请注意,下面显示的 y 轴以幅值平方表示。您可以通过右键点击轴标签并从菜单中选择 Magnitude Squared 来设置。

加权 CLS 滤波器设计

加权 CLS 滤波器设计可用于设计低通或高通 FIR 滤波器,每个频带中具有误差最小化的相对加权。您可以使用 fircls1 函数指定最小二乘加权函数的通带和阻带边缘,还可指定表示阻带与通带加权比率的常数 k

例如,假设要设计一个脉冲响应阶数为 55、归一化截止频率为 0.3 的 FIR 滤波器。还假设最大允许通带波纹为 0.02,最大允许阻带波纹为 0.004。此外,还需要添加以下加权要求:

  • 权重函数为 0.28(归一化)的通带边缘

  • 权重函数为 0.32 的阻带边缘

  • 阻带中的加权误差最小化是通带中的 10 倍

要使用 fircls1 逼近此问题,请键入

n = 55;
wo = 0.3;
dp = 0.02;
ds = 0.004;
wp = 0.28;
ws = 0.32;
k = 10;
h = fircls1(n,wo,dp,ds,wp,ws,k);
fvtool(h,1)

请注意,下面显示的 y 轴以幅值平方表示。您可以通过右键点击轴标签并从菜单中选择 Magnitude Squared 来设置。

任意响应滤波器设计

cfirpm 滤波器设计函数为设计具有任意复响应的 FIR 滤波器提供工具。它与其他滤波器设计函数的不同之处在于如何指定滤波器的频率响应:它接受函数的名称,该函数返回在频率网格上计算的滤波器响应。这种能力使 cfirpm 成为一种高度通用和强大的滤波器设计方法。

这种设计方法可用于生成非线性相位 FIR 滤波器、不对称频率响应滤波器(具有复系数)或更多具有自定义频率响应的对称滤波器。

该设计算法使用扩展的 Remez 交换算法优化 Chebyshev(或 minimax)误差来获得初始估计值。如果使用这种交换算法未能获得最佳滤波器,将改用上升-下降算法继续以收敛至最佳解。

多频带滤波器设计

以具有以下特殊频域特征的多频带滤波器为例。

频带

幅值

优化权重

[–1 –0.5]

[5 1]

1

[–0.4 +0.3]

[2 2]

10

[+0.4 +0.8]

[2 1]

5

可以使用预定义的频率响应函数 multiband 设计线性相位多频带滤波器,如下所示:

b = cfirpm(38, [-1 -0.5 -0.4 0.3 0.4 0.8], ...
               {'multiband', [5 1 2 2 2 1]}, [1 10 5]);

对于多频带滤波器的特定情况,我们可以使用类似于 firpm 语法的简化滤波器设计表示法:

b = cfirpm(38,[-1 -0.5 -0.4 0.3 0.4 0.8], ...
              [5 1 2 2 2 1], [1 10 5]);

firpm 一样,频带边缘向量被传递给 cfirpm。该向量定义执行优化的频带;请注意,有两个过渡带,从 –0.5 到 –0.4 和从 0.3 到 0.4。

采用上述任一方法,您都可以获得频率响应,并在 FVTool 中使用线性刻度绘制响应:

fvtool(b,1)

请注意,下面显示的数据范围是 (-pi,pi)

此多频带滤波器具有复数响应,这是预期的结果,因为频域不对称。您也可以从 FVTool 工具栏中选择绘制脉冲响应,如下所示。

减少延迟的滤波器设计

假设要设计一个具有半 Nyquist 截止频率的 62 抽头低通滤波器。如果我们为 lowpass 滤波器设计函数指定一个负偏移值,则该设计的群延迟偏移会明显小于标准线性相位设计的群延迟偏移。此滤波器设计的计算如下:

b = cfirpm(61,[0 0.5 0.55 1],{'lowpass',-16});

由此产生的幅值响应为

fvtool(b,1)

y 轴采用幅值平方,您可以通过右键点击轴标签并从菜单中选择 Magnitude Squared 来进行此设置。

滤波器的群延迟显示偏移已从 N/2 减小到 N/2-16(即从 30.514.5)。然而,现在通带区域中的群延迟不再平坦。要创建此图,请点击工具栏上的 Group Delay Response 按钮。

如果我们将此非线性相位滤波器与有精确的 14.5 个样本的群延迟的线性相位滤波器进行比较,得到的滤波器的阶数为 2*14.5,即 29。使用 b = cfirpm(29,[0 0.5 0.55 1],'lowpass') 时,29 阶滤波器的通带和阻带波纹要大得多。这些比较可以帮助您决定哪种滤波器更适合特定的应用。