# firpm
Parks-McClellan 最优 FIR 滤波器设计
函数库: TySignalProcessing
# 语法
b, = firpm(n, f, a)
b, = firpm(n, f, a, w)
b, = firpm(n, f, a, ftype)
b = firpm(n, f, a; lgrid = number)
b, err, = firpm(___)
b, err, res = firpm(___)
b, = firpm(n, f, fresp, w)
b, = firpm(n, f, fresp, w, ftype)
# 说明
b, = firpm(n,f, a) 返回包含 n 阶 FIR 滤波器的 n+1 个系数的行向量 b。 所得滤波器的频率和幅度特性与向量 f 和 a 给出的特性相匹配。
b, = firpm(n,f, a,w) 使用 w 对频率区间进行加权。
b, = firpm(n, f, a, ftype) 使用 ftype 指定的滤波器类型。
b, = firpm(n, f, a; lgrid = number) 使用整数 lgrid 来控制频率网格的密度。
b, err = firpm(___) 返回 err 中的最大纹波高度。 您可以将它与之前的任何输入语法一起使用。
b, err, res = firpm(___) 以结构 res 的形式返回频率响应特性。
b, = firpm(n, f, fresp, w) 返回一个 FIR 滤波器,其频率幅度特性非常接近使用函数 fresp 返回的。注:目前 fresp 支持 "multiband"、"singleband"。
b, = firpm(n, f, fresp, w, ftype) 设计反对称(奇数)滤波器,其中 ftype 将滤波器指定为微分器或希尔伯特变换器。 如果您不指定 ftype,则会调用 fresp 以确定默认的对称属性。
# 示例
Parks - McClellan 带通滤波器
使用 Parks-McClellan 算法设计 17 阶 FIR 带通滤波器。指定 0.3π 和 0.7π rad/sample 的归一化阻带频率和 0.4π 和 0.6π rad/sample 的归一化带通频率。绘制理想和实际幅度响应。
using TyPlot
using TySignalProcessing
f = [0 0.3 0.4 0.6 0.7 1]
a = [0 0 1 1 0 0]
b, = firpm(17,f,a)
h, w = freqz(b, [1], 512)
plot(f, a, w / pi, abs.(h))
legend(["Ideal", "firpm Design"])
xlabel("Radian Frequency(w / Π)")
ylabel("Magnitude")
Parks - McClellan 低通滤波器
设计一个具有 1500 Hz 通带截止频率和 2000 Hz 阻带截止频率的低通滤波器。 指定 8000 Hz 的采样频率。 要求最大阻带幅度为 0.01,最大通带误差(纹波)为 0.001。 使用 firpmord 获得所需的滤波器阶数、归一化频带边缘、频带幅度和权重。
using TySignalProcessing
n, fo, ao, w = firpmord([1500 2000], [1 0], [0.001 0.01], 8000);
b, = firpm(n, fo, ao, w);
fvtool(b, 1)

具有非对称衰减的 FIR 带通滤波器
使用 Parks-McClellan 算法创建一个 50 阶等波纹 FIR 带通滤波器,用于以 1 kHz 采样的信号。
using TySignalProcessing
N = 50
Fs = 1e3
指定通带跨越 200 Hz 和 300 Hz 之间的频率,并且通带两侧的过渡区域具有 50 Hz 的宽度。
Fstop1 = 150
Fpass1 = 200
Fpass2 = 300
Fstop2 = 350
设计滤波器,使优化拟合权重为权重为 3 的低频阻带、权重为 1 的通带和权重为 100 的高频阻带。显示滤波器的幅度响应。
Wstop1 = 3
Wpass = 1
Wstop2 = 100
b, = firpm(N, [0; Fstop1; Fpass1; Fpass2; Fstop2; Fs / 2] / (Fs / 2), [0, 0, 1, 1, 0, 0], [Wstop1; Wpass; Wstop2])
fvtool(b, 1)

# 输入参数
n - 滤波器阶数正实数
滤波器阶数,指定为一个正实数。
f - 归一化频率实值向量
归一化频率,指定为实值向量。参数必须在 [0, 1] 范围内,其中 1 对应于奈奎斯特频率。向量中元素的数量始终是 2 的倍数。频率必须按升序排列。
a - 所需幅度向量
f 中指定的点处的所需幅度,指定为向量。f 和 a 的长度必须相同。长度必须是偶数。
- 对于 k 为奇数,在频点 (f(k), f(k+1)) 之间所需的幅度是连接点 (f(k), a(k)) 和 (f(k+1) 的线段 ), a(k+1))。
- 对于 k 为偶数,在频点 (f(k), f(k+1)) 之间所需的幅度是未指定的。 这些点之间的区域是过渡区域或对于特定应用不重要的区域。
w - 权重实值向量
用于调整每个频带中的拟合的权重,指定为实值向量。w 的长度是 f 和 a 长度的一半,所以每条带正好有一个权重。
ftype - 滤波器类型"hilbert" | "differentiator"
具有奇对称性(类型 III 和类型 IV)的线性相位滤波器的滤波器类型,指定为 "hilbert" 或 "differentiator":
- "hilbert" - b 中的输出系数遵循关系 b(k) = –b(n + 2 – k), k = 1, ..., n + 1。这类滤波器包括 Hilbert 变换器,它具有整个频带的所需幅度为 1。 例如,
h = firpm(30,[0.1 0.9],[1 1],"hilbert")
设计了一个长度为 31 的近似 FIR 希尔伯特变换器。
- "differentiator" - 对于非零幅度带,滤波器将误差加权 1/f 倍,因此低频处的误差远小于高频处的误差。 对于具有与频率成比例的幅度特性的 FIR 微分器,这些滤波器使最大相对误差(误差与所需幅度之比的最大值)最小化。
lgrid - 频率网格密度整数值
控制频率网格的密度,频率网格大约有(lgridn)/(2bw)个频率点,其中 bw 是 f 覆盖的总频带间隔 [0,1] 的分数。增加 lgrid 通常会导致滤波器更精确地匹配等波纹滤波器,但计算时间更长。
fresp - 频率响应函数
频率响应,指定为函数。注:目前 fresp 支持 "multiband"、"singleband"。
# 输出参数
b - 滤波器系数行向量
滤波器系数,以长度为 n + 1 的行向量形式返回。系数按升序排列。
err - 最大纹波高度标量
最大纹波高度,以标量形式返回。
res - 频率响应特性结构
作为结构返回的频率响应特性。结构res具有以下字段:
| res.fgrid | 用于滤波器设计优化的频率网格向量 |
|---|---|
| res.des | res.fgrid中每个点的期望频率响应 |
| res.wt | opt.fgrid中每个点的权重 |
| res.H | res.fgrid中每个点的实际频率响应 |
| res.error | res.fgrid中每个点的实际频率响应 |
| res.iextr | res.fgrid中每个点的实际频率响应 |
| res.fextr | 极值频率向量 |
# 提示
如果您的滤波器设计无法收敛,则滤波器设计可能不正确。通过检查频率响应来验证设计。
如果您的滤波器设计无法收敛并且最终的滤波器设计不正确,请尝试以下一项或多项操作:
- 增加滤波器阶数。
- 通过减少阻带中的衰减和/或拓宽过渡区域来放松滤波器设计。
# 算法
firpm 使用 Parks-McClellan 算法 [2] 设计了一个线性相位 FIR 滤波器。 Parks-McClellan 算法使用 Remez 交换算法和 Chebyshev 近似理论来设计滤波器,在所需频率响应和实际频率响应之间实现最佳拟合。 在期望频率响应和实际频率响应之间的最大误差最小化的意义上,滤波器是最佳的。 以这种方式设计的滤波器在其频率响应中表现出等波纹行为,有时称为等波纹滤波器。 由于这种等波纹性质,firpm 在其脉冲响应的头部和尾部表现出不连续性。
这些是 I 型(n 奇数)和 II 型(n 偶数)线性相位滤波器。 向量 f 和 a 指定滤波器的频率-幅度特性:
- f 是频率点对的向量,在 0 和 1 之间的范围内指定,其中 1 对应于奈奎斯特频率。 频率必须按递增顺序排列。 重复的频率点是允许的,事实上,它可以用来设计一个与 fir1 和 fir2 函数返回的具有矩形(rectwin)窗口的滤波器完全相同的滤波器。
- a 是一个向量,包含在 f 中指定的点处的所需幅度。对于 k 奇数,在点对 (f(k), f(k+1)) 之间的频率处所需的幅度函数是连接点 (f(k), a(k)) 和 (f(k+) 的线段 1), a(k+1))。对于 k 偶数,在点对 (f(k), f(k+1)) 之间的频率处所需的幅度函数是未指定的。 这些是过渡或“不关心”区域。
- f 和 a 的长度相同。这个长度必须是偶数。
下图说明了定义所需幅度响应时 f 和 a 向量之间的关系。
firpm 对于具有均匀对称性和奈奎斯特频率处的非零通带的配置始终使用偶数滤波器阶数。 使用偶数滤波器阶数的原因是,对于表现出偶数对称性和奇数阶的脉冲响应,奈奎斯特频率处的频率响应必然为 0。如果指定奇数值 n,firpm 会将其递增 1。
firpm 设计 I、II、III 和 IV 型线性相位滤波器。 类型 I 和类型 II 分别是 n 偶数和 n 奇数的默认值,而类型 III (n 偶数) 和类型 IV (n 奇数) 分别使用 'hilbert' 或 'differentiator' 指定,使用 ftype 参数。 不同类型的滤波器对它们的频率响应有不同的对称性和某些限制。 (有关详细信息,请参阅 [3]。)
| 线性相位滤波器类型 | 滤波顺序 | 系数的对称性 | 响应H(f),f=0 | 响应 H(f),f = 1(奈奎斯特) |
|---|---|---|---|---|
| 第一类 | 偶数 | 偶数:b(k)=b(n+2−k), k=1,...,n+1 | 没有限制 | 没有限制 |
| 第二类 | 奇数 | 偶数:b(k)=b(n+2−k), k=1,...,n+1 | 没有限制 | H(1) = 0。如果您尝试构建一个在奈奎斯特频率处具有非零通带的 II 型滤波器,firpm 会将滤波器阶数增加 1。 |
| 第三类 | 偶数 | 奇数: b(k)=−b(n+2−k), k=1,...,n+1 | H(0) = 0 | H(1) = 0 |
| 第四类 | 奇数 | 奇数: b(k)=−b(n+2−k), k=1,...,n+1 | H(0) = 0 | 没有限制 |
# 参考文献
[1] Digital Signal Processing Committee of the IEEE Acoustics, Speech, and Signal Processing Society, eds. Selected Papers in Digital Signal Processing. Vol. II. New York: IEEE Press, 1976.
[2] Digital Signal Processing Committee of the IEEE Acoustics, Speech, and Signal Processing Society, eds. Programs for Digital Signal Processing. New York: IEEE Press, 1979, algorithm 5.1.
[3] Oppenheim, Alan V., Ronald W. Schafer, and John R. Buck. Discrete-Time Signal Processing. Upper Saddle River, NJ: Prentice Hall, 1999, p. 486.
[4] Parks, Thomas W., and C. Sidney Burrus. Digital Filter Design. New York: John Wiley & Sons, 1987, p. 83.
[5] Rabiner, Lawrence R., James H. McClellan, and Thomas W. Parks. "FIR Digital Filter Design Techniques Using Weighted Chebyshev Approximation." Proceedings of the IEEE®. Vol. 63, Number 4, 1975, pp. 595–610.
# 另请参阅
butter | cheby1 | cheby2 | ellip | fir1 | fir2 | fircls | firls | firpmord | rcosdesign