FIR 滤波器设计
此示例说明如何使用加窗、最小二乘或帕克斯-麦克莱伦算法来设计低通、高通、多频带或任意响应滤波器、微分器或希尔伯特变换器。
FIR 滤波器与 IIR 滤波器的比较
与无限持续时间冲激响应 (IIR) 滤波器相比,具有有限持续时间冲激响应的数字滤波器(全零或 FIR 滤波器)既有优点又有缺点。FIR 滤波器具有以下主要优点:
它们可以具有精确的线性相位。
它们始终稳定。
设计方法通常是线性的。
它们可以在硬件中高效实现。
滤波器启动瞬态具有有限持续时间。
FIR 滤波器的主要缺点是,要达到同样的性能水平,其所需阶数远高于 IIR 滤波器。相应地,这些滤波器的延迟通常比同等性能的 IIR 滤波器大得多。
FIR 滤波器概述
下表总结了使用 Signal Processing Toolbox™ 的各种滤波器设计方法,并列出可用于实现这些方法的函数。
滤波器设计方法 | 描述 | 滤波器函数 |
|---|---|---|
加窗 | 对指定的矩形滤波器的截断傅里叶逆变换应用加窗 | |
多频带(包含过渡带) | 对频率范围的子带使用等波纹或最小二乘方法 | |
约束最小二乘 | 根据最大误差约束,在整个频率范围内最小化平方积分误差 | |
任意响应 | 任意响应,包括非线性相位和复数滤波器 | |
升余弦 | 具有平滑正弦过渡的低通响应 |
您也可以使用 digitalFilter 对象设计数字滤波器。有关详细信息,请参阅designfilt。
对于基于 GUI 的工作流,请使用滤波器设计工具或Design Filter实时任务来设计滤波器。
线性相位滤波器
除 cfirpm 外,所有 FIR 滤波器设计函数都只设计线性相位滤波器。这些滤波器系数或“抽头”遵循偶数或奇数对称关系。根据这种对称性以及滤波器的阶数 n 是偶数还是奇数,线性相位滤波器(存储在长度为 的向量 b 中)对其频率响应有一定的固有限制。
线性相位滤波器类型 | 滤波器阶数 | 系数的对称性 | 响应 , | 响应 ,(奈奎斯特) |
|---|---|---|---|---|
I 类 | 偶数 | 偶数: | 无限制 | 无限制 |
II 类 | 奇数 | 偶数: | 无限制 | |
III 类 | 偶数 | 奇数: | ||
IV 类 | 奇数 | 奇数: | 无限制 |
线性相位 FIR 滤波器的相位延迟和群延迟在整个频带内相等且恒定。对于 n 阶线性相位 FIR 滤波器,群延迟为 ,滤波后的信号延迟 个时间步(其傅里叶变换的幅值按滤波器的幅值响应进行缩放)。该属性保持通带中信号的波形;也就是说,没有相位失真。
默认情况下,函数 fir1、fir2、firls、firpm、fircls 和 fircls1 都可用于设计 I 类和 II 类线性相位 FIR 滤波器。rcosdesign 只用于设计 I 类滤波器。在给定 "hilbert" 或 "differentiator" 标志的情况下,firls 和 firpm 都可用于设计 III 和 IV 类线性相位 FIR 滤波器。cfirpm 可用于设计任何类型的线性相位滤波器和非线性相位滤波器。
由于 II 类滤波器在奈奎斯特频率(“高”频率)下的频率响应为零,fir1 不用于设计 II 类高通和带阻滤波器。在这些情况下,如果 n 为奇数值,fir1 将阶加 1,并返回 I 类滤波器。
加窗方法
假设有一个截止频率为 弧度/采样点的理想的矩形数字低通滤波器。该滤波器在幅值小于 的所有频率上都具有幅值 1,在幅值介于 和 之间的频率上具有幅值 0。其冲激响应序列 为
该滤波器不可实现,因为它的冲激响应是无限的和非因果的。要创建有限持续时间冲激响应,请通过应用加窗来截断它。通过在此截断中保留冲激响应的中心部分,可以获得线性相位 FIR 滤波器。例如,一个长度为 51、低通截止频率 为 0.4 π 弧度/采样点的滤波器为
b = 0.4*sinc(0.4*(-25:25));
此处应用的加窗是简单的矩形窗。根据 Parseval 定理,长度为 51 的滤波器在积分最小二乘意义上最接近理想的低通滤波器。显示滤波器的频率响应。请注意,下面显示的 y 轴以幅值平方表示。
filterAnalyzer(b,MagnitudeMode="squared")
响应中会出现振铃和波纹,尤其是在频带边缘附近。这种“吉布斯效应”不会随着滤波器长度的增加而消失,但非矩形窗会减小其幅值。在时域中将信号乘以一个窗函数会使信号在频域中发生卷积或平滑。将长度为 51 的汉明窗应用于滤波器并显示结果。请注意,图中显示的 轴以幅值平方表示。
bw = b.*hamming(51)';
filterAnalyzer(bw,MagnitudeMode="squared")使用汉明窗可以大大降低振铃。这一改善以过渡带宽度和最优性为代价:加窗的滤波器需要更长时间从通带下降到阻带,且无法最小化平方误差积分。
标准频带 FIR 滤波器设计:fir1
fir1 函数使用最小二乘逼近计算滤波器系数,然后通过加窗对冲激响应进行平滑处理。有关加窗及其属性的概述,请参阅加窗法。fir1 类似于 IIR 滤波器的设计函数,因为它用于设计标准频带配置(低通、带通、高通和带阻)条件下的滤波器。
创建一个行向量,其中包含一个 50 阶汉明窗低通滤波器的系数。
n = 50; Wn = 0.4; bF1 = fir1(n,Wn);
这是一个低通线性相位 FIR 滤波器,截止频率为 Wn。Wn 是介于 0 和 1 之间的数字,其中 1 对应于奈奎斯特频率,即采样频率的一半。(与其他方法不同,此处 Wn 对应于 6 dB 点。)要获得高通滤波器,只需将 "high" 添加到函数的参数列表中。要获得带通或带阻滤波器,请将 Wn 指定为包含通带边缘频率的二元素向量。为带阻配置追加 "stop"。
bF1w = fir1(n,Wn,window) 使用列向量 window 中指定的窗进行设计。向量 window 的长度必须为 n+1 个元素。如果未指定窗口,fir1 将应用汉明窗。
凯塞窗阶估计
kaiserord 函数估计滤波器阶数、截止频率和凯塞窗 β 参数,使之满足一组给定的滤波器设定。在给定频带边缘向量和对应的幅值向量以及最大允许波纹的情况下,kaiserord 为 fir1 函数返回适当的输入参数。
多频带 FIR 滤波器设计:fir2
fir2 函数还可用于设计加窗的 FIR 滤波器,但具有任意形状的分段线性频率响应。这与 fir1 不同,后者仅设计具有标准低通、高通、带通和带阻配置的滤波器。
生成一个行向量 b,其中包含 n 阶 FIR 滤波器的 n+1 个系数,其频率幅值特征与向量 f 和 m 给出的频率幅值特征相匹配。
n = 50;
f = [0 .4 .5 1];
m = [1 1 0 0];
bF2 = fir2(n,f,m);
filterAnalyzer(bF2,MagnitudeMode="squared")
f 是频率点的向量,范围从 0 到 1,其中 1 代表奈奎斯特频率。m 是向量,包含 f 中指定点处的指定幅值响应。(该函数的对应 IIR 函数是 yulewalk,后者还可基于任意分段线性幅值响应设计滤波器。有关详细信息,请参阅 IIR 滤波器设计。)
具有过渡带的多频带 FIR 滤波器设计
与 fir1 和 fir2 函数相比,firls 和 firpm 函数提供更通用的指定理想滤波器的方法。这些函数用于设计希尔伯特变换器、微分器和其他具有奇数对称系数(III 类和 IV 类线性相位)的滤波器。它们还允许您包括误差没有最小化的过渡或“不重要”区域,并执行最小化的频带相关加权。
firls 函数是 fir1 和 fir2 函数的扩展,它用于最小化指定频率响应和实际频率响应之间误差平方的积分。
firpm 函数实现帕克斯-麦克莱伦算法,该算法使用雷米兹交换算法和切比雪夫逼近理论来设计在指定频率响应和实际频率响应之间具有最佳拟合的滤波器。这种滤波器可最小化指定频率响应和实际频率响应之间的最大误差,从这种意义上而言,它们是最优的滤波器;它们有时被称为 minimax 滤波器。以这种方式设计的滤波器在频率响应方面表现出等波纹特性,因此也称为等波纹滤波器。帕克斯-麦克莱伦 FIR 滤波器设计算法可能是最流行和最广泛使用的 FIR 滤波器设计方法。
firls 和 firpm 的语法相同;唯一的区别体现在最小化方案上。下一个示例说明用 firls 和 firpm 设计的滤波器如何反映这些不同方案。
基本配置
firls 和 firpm 的默认操作模式是设计 I 类或 II 类线性相位滤波器,具体取决于您所需的阶是偶数还是奇数。以下低通示例在 0 到 0.4 Hz 逼近振幅 1,在 0.5 到 1.0 Hz 逼近振幅 0:
n0 = 20; % Filter order f0 = [0 0.4 0.5 1]; % Frequency band edges A0 = [1 1 0 0]; % Amplitudes bPM0 = firpm(n,f0,A0);
从 0.4 Hz 到 0.5 Hz,firpm 不执行误差最小化;这是一个过渡带或“不重要”区域。过渡带将您关心的频带中的误差降至最低,但代价是过渡速率变慢。在这种方式下,这些类型的滤波器具有固有的折衷,类似于加窗的 FIR 设计。
要将最小二乘与等波纹滤波器设计进行比较,请使用 firls 创建一个类似的滤波器。键入
bLS0 = firls(n0,f0,A0);
并使用滤波器分析器比较其频率响应。请注意,下图中显示的 y 轴采用幅值平方。您可以通过使用名称-值参量 MagnitudeMode 来自动设置此项,或通过点击分析器部分中的分析选项按钮并从滤波器分析器的幅值选项菜单中选择 Squared 来手动设置此项。
filterAnalyzer(bPM0,1,bLS0,1, ... FilterNames=["bPM0" "bLS0"],MagnitudeMode="squared")

使用 firpm 设计的滤波器表现出等波纹行为。另请注意,firls 滤波器在大部分通带和阻带上都有更好的响应,但在频带边缘(f = 0.4 和 f = 0.5)处,响应不如 firpm 滤波器的响应理想。这表明,firpm 滤波器在通带和阻带上的最大误差较小,事实上,对于该频带边缘配置和滤波器长度来说,这是可能的最小值。
可以将频带视为短频率区间内的线。firpm 和 firls 使用此方案来表示具有任何过渡带的任何分段线性频率响应函数。firls 和 firpm 用于设计低通、高通、带通和带阻滤波器;以下是一个带通示例
fMB0 = [0 0.3 0.4 0.7 0.8 1]; % Band edges in pairs aMB0 = [0 0 1 1 0 0]; % Bandpass filter amplitude
从技术上讲,这些 f 和 a 向量定义五个频带:
两个阻带,从 0.0 到 0.3 和从 0.8 到 1.0
一个通带,从 0.4 到 0.7
两个过渡带,从 0.3 到 0.4 和从 0.7 到 0.8
以下为高通和带阻滤波器的示例
fHP = [0 0.7 0.8 1]; % Band edges in pairs aHP = [0 0 1 1]; % Highpass filter amplitude fBS = [0 0.3 0.4 0.5 0.8 1]; % Band edges in pairs aBS = [1 1 0 0 1 1]; % Bandstop filter amplitude
以下是多频带带通滤波器的示例
fMB = [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]; aMB = [1 1 0 0 1 1 0 0 1 1 0 0 1 1];
另一种可能的滤波器具有连接通带和阻带的线作为过渡区域;这有助于控制宽过渡区域的“失控”幅值响应:
fTB = [0 0.4 0.42 0.48 0.5 1]; aTB = [1 1 0.8 0.2 0 0]; % Passband, linear transition, % stopband
权重向量
firls 和 firpm 都允许您有所侧重地将某些频带的误差降至最低。为此,请在频率和振幅向量后指定权重向量。在以下低通等波纹滤波器示例中,阻带中的波纹比通带中的小 10 倍
nWV = 20; % Filter order fWV = [0 0.4 0.5 1]; % Frequency band edges aWV = [1 1 0 0]; % Amplitudes wv = [1 10]; % Weight vector bWV = firpm(nWV,fWV,aWV,wv);
反对称滤波器和希尔伯特变换器
当用尾部 "h" 或 "hilbert" 选项调用时,firpm 和 firls 会设计奇对称的 FIR 滤波器,即 III 类(偶数阶)或 IV 类(奇数阶)线性相位滤波器。理想的希尔伯特变换器具有这种反对称属性,且在整个频率范围内振幅为 1。尝试以下逼近希尔伯特变换器,并对其绘图。
bHHP = firpm(21,[0.05 1],[1 1],"hilbert"); % Highpass bHBP = firpm(20,[0.05 0.95],[1 1],"hilbert"); % Bandpass filterAnalyzer(bHHP,1,bHBP,1,FilterNames=["bHHP" "bHBP"])

通过这些滤波器,您可以求得信号 x 的延迟希尔伯特变换。
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(bHBP,1,x); % Hilbert transform of x
对应于 x 的分析信号是以 x 为实部、以 x 的希尔伯特变换为虚部的复信号。对于这种 FIR 方法(hilbert 函数的替代方法),您必须将 x 延迟一半滤波器阶数才能创建分析信号:
xd = [zeros(10,1); x(1:length(x)-10)]; % Delay 10 samples xa = xd + 1i*xh; % Analytic signal
这种方法不能直接用于奇数阶滤波器,因为奇数阶滤波器需要非整数延迟。在这种情况下,希尔伯特变换中所述的 hilbert 函数可估算解析信号。或者,使用 resample 函数将信号延迟非整数个样本。
微分器
信号在时域中的微分等效于信号的傅里叶变换乘以虚斜坡函数。也就是说,要对信号求导,请将其传递给具有响应 的滤波器。使用 firpm 或 firls 和 "d" 或 "differentiator" 选项逼近理想的微分器(有延迟):
bDiff10 = firpm(21,[0 1],[0 pi],"differentiator");对于 III 类滤波器,微分频带不应超过奈奎斯特频率,振幅向量必须反映此变化,以确保斜率正确:
bDiff09 = firpm(20,[0 0.9],[0 0.9*pi],"differentiator");在 "d" 模式下,firpm 在非零振幅频带中对误差加权 ,以最小化最大相对误差。在 "d" 模式下,firls 在非零振幅频带中对误差加权 。
绘图显示微分器的幅值响应。
filterAnalyzer(bDiff10,1,bDiff09,1,FilterNames=["Odd" "Even"])

约束最小二乘 FIR 滤波器设计
使用约束最小二乘 (CLS) FIR 滤波器设计函数时,您无需显式定义幅值响应过渡带即可设计 FIR 滤波器。省略过渡带设定的功能在很多情况下都很有用。例如,如果噪声和信号信息一起出现在同一个频带中,可能不清楚严格定义的过渡带应该出现在哪里。同样,如果过渡带的出现仅仅是为了控制滤波器响应中出现的吉布斯现象的结果,则可以省略过渡带设定。有关这种方法的讨论,请参阅 Selesnick、Lang 和 Burrus·[3]。
对于您指定的响应,CLS 方法不定义通带、阻带和过渡区域,而是接受截止频率(对于高通、低通、带通或带阻情况)或者通带和阻带边缘(对于多频带情况)。通过这种方式,CLS 方法可以隐式(而不是显式)定义过渡区域。
CLS 方法的主要特点是它使您能够定义上阈值和下阈值,其中包含幅值响应中允许的最大波纹。在给定此约束的情况下,该方法在滤波器响应的频率范围内(而不是在特定频带上)应用最小二乘误差最小化方法。误差最小化包括理想的矩形响应中的任何不连续区域。另一个好处是,该方法使您能够指定吉布斯现象产生的任意小的峰值。
有两个函数可实现这种设计方法。
有关这些函数的调用语法的详细信息,请参阅函数参考中相应的参考说明。
基本低通和高通 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; bCLS = fircls1(n,wo,dp,ds);
显示幅值响应。请注意,下面显示的 y 轴以幅值平方表示。
filterAnalyzer(bCLS,MagnitudeMode="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 滤波器,满足以下设定。显示幅值响应。请注意,下面显示的 y 轴以幅值平方表示。
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];
bCLSmb = fircls(n,f,a,up,lo);
filterAnalyzer(bCLSmb,MagnitudeMode="squared")
加权 CLS 滤波器设计
加权 CLS 滤波器设计可用于设计低通或高通 FIR 滤波器,每个频带中具有误差最小化的相对加权。您可以使用 fircls1 函数指定最小二乘加权函数的通带和阻带边缘,还可指定表示阻带与通带加权比率的常数 k。
例如,假设要设计一个冲激响应阶数为 55、归一化截止频率为 0.3 的 FIR 滤波器。还假设最大允许通带波纹为 0.02,最大允许阻带波纹为 0.004。此外,还需要添加以下加权要求:
权重函数为 0.28(归一化)的通带边缘
权重函数为 0.32 的阻带边缘
阻带中的加权误差最小化是通带中的 10 倍
要使用 fircls1 逼近此问题,请键入以下命令。请注意,下面显示的 y 轴以幅值平方表示。
n = 55;
wo = 0.3;
dp = 0.02;
ds = 0.004;
wp = 0.28;
ws = 0.32;
k = 10;
bCLSw = fircls1(n,wo,dp,ds,wp,ws,k);
filterAnalyzer(bCLSw,MagnitudeMode="squared")
任意响应滤波器设计
cfirpm 滤波器设计函数为设计具有任意复响应的 FIR 滤波器提供工具。它与其他滤波器设计函数的不同之处在于如何指定滤波器的频率响应:它接受函数的名称,该函数返回在频率网格上计算的滤波器响应。这种能力使 cfirpm 成为一种高度通用和强大的滤波器设计方法。
这种设计方法可用于生成非线性相位 FIR 滤波器、不对称频率响应滤波器(具有复系数)或更多具有自定义频率响应的对称滤波器。
该设计算法使用扩展的雷米兹交换算法优化切比雪夫(或 minimax)误差来获得初始估计值。如果使用这种交换算法未能获得最佳滤波器,将改用上升-下降算法继续以收敛至最佳解。
多频带滤波器设计
以具有以下特殊频域特征的多频带滤波器为例。
频带 | 振幅 | 优化权重 |
|---|---|---|
可以使用预定义的频率响应函数 multiband 设计线性相位多频带滤波器,如下所示:
bMBh = cfirpm(38, [-1 -0.5 -0.4 0.3 0.4 0.8], ...
{@multiband, [5 1 2 2 2 1]}, [1 10 5]);对于多频带滤波器的特定情况,我们可以使用类似于 firpm 语法的简化滤波器设计表示法:
bMBd = 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。
在任一情况下,获取频率响应并使用线性刻度绘图。请注意,数据的范围是 (-pi,pi)。
filterAnalyzer(bMBd,FrequencyRange="centered")
此多频带滤波器具有复数响应,这是预期的结果,因为频域不对称。冲激响应如下所示。
filterAnalyzer(bMBd,Analysis="impulse")
减少延迟的滤波器设计
假设要设计一个具有半奈奎斯特截止频率的 62 抽头低通滤波器。如果我们为 lowpass 滤波器设计函数指定一个负偏移值,则该设计的群延迟偏移会明显小于标准线性相位设计的群延迟偏移。此滤波器设计的计算如下:
bRD = cfirpm(61,[0 0.5 0.55 1],{@lowpass,-16});由此产生的幅值响应如下所示。y 轴采用幅值平方,您可以通过右键点击轴标签并从菜单中选择幅值平方来进行此设置。
filterAnalyzer(bRD,MagnitudeMode="squared")
滤波器的群延迟显示偏移已从 N/2 减小到 N/2-16(即从 30.5 到 14.5)。然而,现在通带区域中的群延迟不再平坦。要创建此图,请点击工具栏上的群延迟响应按钮。
filterAnalyzer(bRD,Analysis="groupdelay")
如果我们将此非线性相位滤波器与有精确的 14.5 个样本的群延迟的线性相位滤波器进行比较,得到的滤波器的阶数为 2*14.5,即 29。使用 bRD = cfirpm(29,[0 0.5 0.55 1],"lowpass") 时,29 阶滤波器的通带和阻带波纹要大得多。这些比较可以帮助您决定哪种滤波器更适合特定的应用。