假定以下一阶IIR滤波器:
我如何选择参数 st IIR尽可能接近FIR,FIR是最后样本的算术平均值:
其中,表示IIR的输入可能比,但我想对最后输入的平均值进行最佳近似。
我知道IIR具有无限的脉冲响应,因此我正在寻找最佳近似值。无论是还是成本函数的分析解决方案,我都很高兴。
仅给出一阶IIR,如何解决此优化问题。
谢谢。
假定以下一阶IIR滤波器:
我如何选择参数 st IIR尽可能接近FIR,FIR是最后样本的算术平均值:
其中,表示IIR的输入可能比,但我想对最后输入的平均值进行最佳近似。
我知道IIR具有无限的脉冲响应,因此我正在寻找最佳近似值。无论是还是成本函数的分析解决方案,我都很高兴。
仅给出一阶IIR,如何解决此优化问题。
谢谢。
Answers:
没有是标量的解析解决方案(我认为)。这是一个给定脚本。如果您在线需要它,则可以构建一个LUT。该脚本找到了最小化的解决方案α ķ
其中是FIR频率响应,而是IIR频率响应。高2
您没有为K指定任何范围。但是,我只想说明一下,以下系统等效于您的均值滤波器,并且具有相同的计算复杂度和一阶IIR!
function a = find_a(K)
w = 0.0001:0.001:pi;
as = [-1:0.001:-0.001 0.001:0.001:1];
E = zeros(size(as));
for idx=1:length(as)
fJ = J(w,as(idx),K);
E(idx) = sum(fJ);
end
[Emin, indx] = min(E)
a = as(indx)
function f = J(w,a,K)
num = 2*(2-a)*(1-cos(w*K)) + 2*(cos(w*(K-1)) - cos(w)) - 2*(1-a)*(cos(w)-cos(w*(K+1)));
den = (2-a)^2 + 1 + (1-a)^2 + 2*(1-a)*cos(2*w) - 2*(2-a)^2*cos(w);
f = -(a/K)*num./den;
f = f+(1/K^2)*(1-cos(w*K))./(1-cos(w))+a^2./(1+(1-a)^2-2*(1-a)*cos(w));
end
end
在使用微信号架构的嵌入式信号处理中,大约在第63页至第69页之间对此问题进行了很好的讨论。在第63页上,它包括精确的递归移动平均滤波器的推导(niaren在他的回答中给出),
为了便于进行以下讨论,它对应于以下差分方程式:
将滤波器放入您指定形式的近似值需要假设,因为(我从第68页引述)“是样本的平均值”。这种近似使我们可以简化前面的差分方程,如下所示: Ÿ ñ - 1 X Ñ
设置,我们得到您的原始形式,这表明您想要的系数(相对于此近似值)恰好是(其中是样本数)。 ÿÑ=αXÑ+(1-α)ýñ-11 N
在某种程度上,这种近似值是“最佳”的吗?当然很优雅。以下是在N = 3且N增至10(蓝色近似值)时,幅度响应在[44.1kHz]下进行比较的方式:
正如彼得的答案所暗示的那样,在最小二乘范数下,用递归滤波器近似FIR滤波器可能会有问题。一般而言,如何解决此问题的广泛讨论可以在JOS的论文《数字滤波器设计和系统识别技术及其在小提琴中的应用》中找到。他主张使用Hankel范数,但是在相位响应无关紧要的情况下,他也介绍了Kopec的方法,该方法在这种情况下可能会很好地工作(并使用范数)。在这里可以找到对本文技术的广泛概述。他们可能会得出其他有趣的近似值。
好,让我们尝试得出最好的结果: 这样的系数为。 X[Ñ-m]α(1-α)m
最佳均方近似值将最小化: m>k−1
下一步是求导数并等于零。
纵观衍生的情节为和从0到1,它看起来像这个问题(因为我已经将它设置)是病态的,因为最好的答案是。ķ = 1000 α α = 0
我认为这是一个错误。根据我的计算应该是这样的:
在MATLAB上使用以下代码会产生相同的效果,尽管有所不同:
syms a k;
expr1 = (a ^ 2) * ((1 - ((1 - a) ^ (2 * k))) / (1 - ((1 - a) ^ 2)));
expr2 = ((2 * a) / k) * ((1 - ((1 - a) ^ (k))) / (1 - (1 - a)));
expr3 = (1 / k);
expr4 = ((a ^ 2) * ((1 - a) ^ (2 * k))) / (1 - ((1 - a) ^ (2)));
simpExpr = simplify(expr1 - expr2 + expr3 + expr4);
无论如何,这些功能确实具有最低限度。
因此,假设我们真的只关心FIR滤波器的支持(长度)上的近似值。在那种情况下,优化问题就是:
绘图为各种值与导致在曲线图和表下方的日期。
对于 =8。 = 0.1533333 对于 =16。 = 0.08 对于 =24。 = 0.0533333 对于 =32。 = 0.04 对于 =40。 = 0.0333333 对于 =48。 = 0.0266667 对于 =56。 = 0.0233333 对于 = 64。
= 0.02
对于 =72。 = 0.0166667
红色虚线是,绿色虚线是,这是使最小的值(从选择[)。
基于与实验测试k
中范围(2到100)的最佳拟合(误差平方和)给出的关系alfa = 1/k^0.865
是k
采样数为MovAvg滤波器
我偶然发现了这个老问题,我想分享我的解决方案。如其他答案中所述,没有解析解,但是要最小化的函数表现良好,并且可以通过几次牛顿迭代轻松找到的最佳值。还有一个公式可以检查结果的最优性。
长度为 FIR移动平均滤波器的脉冲响应由下式给出
其中是单位步长函数。一阶IIR滤波器
有冲动的反应
现在的目标是最小化平方误差
使用和,错误可以写成
此表达式与该答案中给出的表达式非常相似,但并不完全相同。上的限制在可以确保无限和收敛,这是与用于由下式给出的IIR滤波器的稳定性条件。
将的导数设置为零会导致
请注意,最佳必须在间隔因为较大的值会导致交替的脉冲响应,这不能近似于FIR移动平均滤波器的恒定脉冲响应。
取平方根并引入,我们得到
该方程无法通过解析地求解,但可以通过来求解:ñ
公式可用于仔细检查的数值解;它必须返回的指定值。(7 )N
可以使用几行(Matlab / Octave)代码求解方程式:
N = 50;FIR移动平均滤波器所需滤波器长度的百分比 if(N == 1)%对于小情况无迭代 b = 0; 其他 牛顿迭代百分比 b = 1;起始值% 尼特= 7; n =(N + 1)/ 2; 对于k = 1:Nit f = b ^ n + b ^(n-1)-1; fp = n * b ^(n-1)+(n-1)* b ^(n-2); b = b-f / fp; 结束 检查结果百分比 N0 = -2 * log(1 + b)/ log(b)+1%必须等于N 结束 a = 1-b;
下表是针对一定范围的过滤器长度的最佳值的表:ñ
Nα 1 1.0000e + 00 2 5.3443e-01 3 3.8197e-01 4 2.9839e-01 5 2.4512e-01 6 2.0809e-01 7 1.8083e-01 8 1.5990e-01 9 1.4333e-01 10 1.2987e-01 20 6.7023e-02 30 4.5175e-02 40 3.4071e-02 50 2.7349e-02 60 2.2842e-02 70 1.9611e-02 80 1.7180e-02 90 1.5286e-02 100 1.3768e-02 200 6.9076e-03 300 4.6103e-03 400 3.4597e-03 500 2.7688e-03 600 2.3078e-03 700 1.9785e-03 800 1.7314e-03 900 1.5391e-03 1000 1.3853e-03