使用 MATLAB 函数“mpiir_l2()”:结果不是 IIR,而是 FIR 滤波器 - 为什么以及如何避免这种情况?

信息处理 matlab 过滤器 过滤器设计 有限脉冲响应 无限脉冲响应
2022-02-17 02:37:16

我正在使用mpiir_l2()用户Matt L博士论文来设计 IIR 滤波器。我将分子和分母系数的数量都设置为相同的值(在100300)。最大磁极半径为0.98. 我的观察是结果实际上是一个 FIR 滤波器,分母系数总是[1,0,0,...]. 基本上,结果等于lslevin()同一来源的最小二乘 FIR 设计的函数。

显然,我的滤波器规范中的某些内容使 FIR 解决方案比任何 IIR 滤波器具有更好的错误。该规范是数值优化的结果,在人眼看来非常随机,所以我不确定要寻找哪些属性。

有没有办法从这个函数中得到一个真正的 IIR 滤波器?我想比较相同规格的 IIR 和 FIR 滤波器,看看哪个更好。现在,当结果基本相同时,我真的无法比较。

编辑:这是一个示例脚本和相应的所需响应。看来我必须为此使用第三方托管网站,抱歉。

close all;
clear all;

% loads the specification, weights and frequencies as three vectors
% the sepcification has a relevant band that is padded with zeros to both
% sides. There is a "don't care" gap between the relevant band and the
% zeros.
load 'desiredResponse.mat' % loads Ws, freqs, desiredResponse 

% search area
allowedOrder = 1:1:3;       % numerator and denominator order 
allowedShifts = 0:0.125:2;      % linear phase term

% other variables
Fs = 48000;
normalFreqs = freqs / Fs * 2 * pi; % normalized frequencies
poleRadius = 0.98;

% preallcoate for the search
lowestError = inf;
bestNum = [];
bestDenom = [];
errors = zeros(length(allowedOrder), length(allowedShifts));
orders = zeros(length(allowedOrder), length(allowedShifts));
shifts = zeros(length(allowedOrder), length(allowedShifts));

% search for best aproximation
for nl = 1:length(allowedOrder)
    ord = allowedOrder(nl);
    for ns = 1:length(allowedShifts)
        orders(nl, ns) = ord;
        shifts(nl, ns) = allowedShifts(ns);
        % add the linear phase shift
        phaseShiftTerm = exp(-1i * shifts(nl, ns) * (ord-1)/2/Fs * 2 * pi * freqs);
        D = desiredResponse .* phaseShiftTerm;

        % design the filter (change denominator order here, if you like)
        [num,denom] = mpiir_l2(ord, ord, normalFreqs, D, Ws, poleRadius);

        % calculate filter response
        H = freqz(num, denom, freqs, Fs);
        % calculate the weighted error
        errors(nl, ns) = sum(Ws .* abs(H - D).^2);

        if errors(nl, ns) < lowestError
            lowestError = errors(nl, ns);
            bestNum = num;
            bestDenom = denom;
        end
    end
end
1个回答

我看了你的规格,我设计了一些过滤器来看看发生了什么。首先,对于给定的规格,我们不应该期望 IIR 滤波器的性能应该比 FIR 滤波器好得多,因为如果必须实现从通带到阻带的急剧过渡,例如频率的情况,极点主要是有用的。选择性过滤器。在您的情况下,我们没有急剧的过渡,并且添加极点不太可能显着改善设计。当然,理论上应该通过添加极点来降低逼近误差(如果分子阶与 FIR 解决方案相比没有改变),但相对于 FIR 滤波器的改进可能很小。然而,在实践中,得到的 IIR 滤波器甚至可能比具有相同(分子)阶的 FIR 滤波器更差。有两个原因:第一,r<1为了得到一个可以实现的稳定过滤器。该限制可能会增加可能的近似误差。

事实证明,在您的情况下,使用 IIR 滤波器并不能大大改善情况。我使用了长度为 FIR 的滤波器N=100和具有相同数量分子系数的 IIR 滤波器,以及6远离原点的附加极点z-飞机。频率响应的幅度如下图所示(蓝色:期望,绿色:FIR,红色:IIR)。IIR 近似值稍好一些,但差异可能不值得。下图放大了较低的频率,其中 IIR 滤波器更接近所需的响应。两个滤波器的相位响应(未显示)是可比较的。请注意,对于 FIR 和 IIR 设计,我分别优化了添加到给定相位响应中的必要线性相位项。

在此处输入图像描述

IIR 滤波器的极点半径介于0.890.98(r=0.98在设计过程中被选为最大极点半径)。所以设计的 IIR 滤波器实际上是 IIR,而不仅仅是其所有极点(大约)在原点的 FIR。我不知道你为什么只获得实际上是 FIR 的 IIR 设计。