正如我在评论中提到的,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)具有几乎相同的幅度响应。