您在步骤 1 中所做的只是截断无限脉冲响应以通过 FIR 滤波器对其进行近似。如果您使用足够多的滤波器抽头,则近似值会变得任意准确。这意味着生成的 FIR 滤波器近似于原始 IIR 滤波器的幅度和相位特性。所以用这种方法,相位永远不会变成线性的。
正如您在步骤 2 中所做的那样,使脉冲响应对称以获得相位线性,当然会改变幅度响应。
您应该做的是使用 IIR 滤波器的幅度作为(线性相位)FIR 滤波器设计例程中的所需响应。在这种情况下,您将得到一个具有完全线性相位和一定幅度近似误差的 FIR 滤波器。通过选择适当的滤波器阶数,可以使幅度误差足够小。最简单的方法可能是使用最小二乘近似,它只涉及求解线性方程组。
示例:我使用一个峰值 EQ 滤波器作为 IIR 原型。系数是(b
是分子系数,a
是分母系数):
b = [1.2223e+00, 0, 7.7775e-01];
a = [1.1250e+00, 0, 8.7502e-01];
您可以使用 IIR 滤波器频率响应的幅度并将其与线性相位相结合,以获得 FIR 滤波器设计例程所需的响应(N
即滤波器长度)。代码是 Matlab/Octave 语法:
[H,w] = 频率 (b,a,256);
N = 61;
D = abs(H).*exp(-1i*w*(N-1)/2);
您可以使用名为的最小二乘 FIR 滤波器设计例程lslevin.m
,您可以在此处找到该例程。
h = lslevin(N,w,D,ones(长度(w),1));
Hh = 频率 (h,1,256);
下图显示了两个频率响应(IIR 和 FIR)的幅度: