FIR 滤波器设计 - 输入参数转换

信息处理 过滤器 过滤器设计 数字滤波器 帕克斯-麦克莱伦
2022-02-04 21:23:19

我是 DSP 和滤波器设计的新手。我在 C++ 中开发了一个代码来使用 Parks-McClellan 算法计算 FIR 系数。计算的输入是:

  1. 滤波器类型(低通、高通)
  2. 通带频率 [Hz]
  3. 阻带频率 [Hz]
  4. 通带纹波 [dB]
  5. 阻带衰减 [dB]。

我对输入有了新的要求,即使用: 1. 截止频率 (6dB@1.6kHz) 2. 斜率 [24dB/octave]。

有没有办法将这些输入转换为我在 C++ 代码中使用的输入,如上所述?

或者,更一般的问题,如何设计具有自定义斜率的 FIR 滤波器?

谢谢你。

2个回答

正如我在评论中提到的,Parks McClellan 算法通常用于设计具有固定最大阻带误差的频率选择滤波器,这会导致阻带中的等波纹行为。请注意,该算法原则上可以近似任何所需的频率响应形状。然而,许多实现只允许分段恒定的期望响应(包括所有标准频率选择滤波器,例如低通、高通等)。

如果你想要一个从截止频率单调衰减的频率响应,你可能需要一个像巴特沃斯滤波器这样的东西。这是一个 IIR 滤波器,通常通过模拟原型滤波器的双线性变换设计。如果您想要一个 FIR 滤波器,那么一种选择是截断(或窗口化)巴特沃斯滤波器的无限脉冲响应。

在 Matlab/Octave 中,这可以很容易地完成,如下所示。首先设计一个具有给定规格的数字巴特沃斯滤波器,计算其脉冲响应,并将其截断。在哪里截断取决于您允许的错误。对于您的示例,三阶巴特沃斯滤波器就足够了。在以下示例中,我假设采样频率为8kHz

[b,a] = 黄油(3,1.6/4); % 巴特沃斯 IIR 滤波器
h = impz(b,a,30); % 脉冲响应 (30 coeffs)
f = 对数空间(0,3.6,400);% 日志。频率网格 [1,4000]Hz
H = 频率 (b,a,f*pi/4000); % 巴特沃斯频率响应
Hf = 频率 (h,1,f*pi/4000); % FIR 频率响应
semilogx(f,20*log10(abs(H)),f,20*log10(abs(Hf)))
轴([1,4000,-80,5]),网格打开

在此处输入图像描述

您只看到一条曲线,因为两个滤波器(IIR 和 FIR)具有几乎相同的幅度响应。

要进行任何算法 FIR 滤波器设计,您必须指定或假设(或仅采用一些默认值)最小阻带衰减。一旦提供了真实的阻带衰减,通过调整 FIR 滤波器长度以及通带和阻带频率之间的增量来控制发生器算法的过渡斜率,直到达到所需的结果。也许是迭代的。

对于允许给定过渡斜率的最小 FIR 滤波器长度,存在一些经验法则近似值。也许这就是你要找的?