极大极小优化

这个例子展示了如何使用极小极大优化算法来解决一个非线性滤波器设计问题,fminimax,在优化工具箱™中。注意,要运行此示例,必须安装信号处理工具箱™。

设置有限精度参数

考虑一个设计有限精度滤波器的例子。为此,您不仅需要指定滤波器的设计参数,如截止频率和系数的数量,还需要指定有多少位可用,因为设计的精度是有限的。

nbits = 8;我们需要多少位才能实现滤波maxbin = 2 ^ nbits-1;以位元表示的最大数目%n = 4;系数数%(滤波器阶数+ 1)Wn = 0.2;滤波器截止频率%Rp = 1.5;通带纹波的%分贝w = 128;要取的频率点数目%

连续设计第一

这是一个连续的过滤器设计;我们使用cheby1,但我们也可以用ellip,yulewalk雷米在这里:

(b1, a1] = cheby1 (n - 1、Rp Wn);[h, w] = freqz (b1, a1, w);%的频率响应h = abs (h);%级响应情节(w h)标题(“使用非整型变量的频率响应”)

x = (b1, a1);%设计变量

设置滤波系数的界限

我们现在设置最大值和最小值的界限:

如果(任何(x < 0))%如果有负系数-必须节省空间使用符号位%,因此减少maxbinmaxbin =地板(maxbin / 2);vlb = -maxbin * ones(1,2 *n)-1;vub = maxbin * ones(1,2 *n);其他的%否则,均为正长春花碱= 0(1、2 * n);vub = maxbin * ones(1,2 *n);结束

比例系数

将最大值设为maxbin,并适当缩放其他滤波器系数。

[m, mix] = max(abs(x));因素= maxbin / m;因子* x;重新调节其他滤波器系数xorig = x;xmask = 1:2 * n;删除最大值和控制直流增益的元素%从可更改值列表中删除。xmask(混合)= [];nx = 2 * n;

设置优化标准

使用optimoptions,将终止条件调整为合理的高值,以促进较短的运行时间。同时在每次迭代时打开结果显示:

选择= optimoptions (“fminimax”,“StepTolerance”, 0.1,“OptimalityTolerance”1的军医,“ConstraintTolerance”1 e-6“显示”,“通路”);

将绝对最大值最小化

我们需要最小化绝对最大值,所以我们设置选项。MinAbsMax表示频率点的数量:

如果length(w) == 1 options = optimoptions(options,“AbsoluteMaxObjectiveCount”, w);其他的选择= optimoptions(选项,“AbsoluteMaxObjectiveCount”、长度(w));结束

为优化消除第一个值

离散化和消除第一值,并通过调用FMINIMAX执行优化:

= elimone(x, xmask, h, w, n, maxbin)
x =1×80.5441 1.6323 1.6323 0.5441 57.1653 -127.0000 108.0000 -33.8267
xmask =1×61 2 3 4 5 8
硝石=长度(xmask);disp (sprintf ('执行%g阶段的优化。\n\n'硝酸钠));
执行6个阶段的优化。
filtobj(xfree,x,xmask,n,h,maxbin);%的目标confun = @ (xfree) filtcon (xfree x, xmask n、h、maxbin);%非线性约束disp (sprintf (“阶段:% g \ n”, m));x (xmask) = fminimax(有趣,x (xmask),[],[],[],[],长春花碱(xmask) vub (xmask),confun选项);= elimone(x, xmask, h, w, n, maxbin);结束
阶段:1
目的最大线搜索方向Iter F-count值约束阶梯导数程序0 8 0 0.00329174 1 17 0.0001845 3.34e-07 1 0.0143局部最小可能。约束满足。fminimax停止的原因是当前搜索方向的大小小于步长容差值的两倍,且约束条件满足于约束容差值之内。
阶段:2
目标最大线搜索方向Iter F-count值约束步长导数程序07 0 0.0414182 1 15 0.01649 0.0002558 1 0.261 2 23 0.01544 6.126e-07 1 -0.0282 Hessian修改局部最小可能值。约束满足。fminimax停止的原因是当前搜索方向的大小小于步长容差值的两倍,且约束条件满足于约束容差值之内。
第三阶段:
目的最大线搜索方向Iter F-count值约束步长导数程序0 6 0 0.0716961 1 13 0.05943 2.6e-10 1 0.776局部最小可能值。约束满足。fminimax停止的原因是当前搜索方向的大小小于步长容差值的两倍,且约束条件满足于约束容差值之内。
第四阶段:
目标最大线搜索方向Iter F-count值约束步长导数程序0 5 0 0.129938 1 11 0.04278 -8.933e-10 1 0.183局部最小可能值。约束满足。fminimax停止的原因是当前搜索方向的大小小于步长容差值的两倍,且约束条件满足于约束容差值之内。
第五阶段:
目标最大线搜索方向Iter F-count值约束步长导数程序0 4 0 0.0901749 1 9 0.03867 -2.263e-10 1 0.256局部最小可能值。约束满足。fminimax停止的原因是当前搜索方向的大小小于步长容差值的两倍,且约束条件满足于约束容差值之内。
第六阶段:
目的最大线搜索方向Iter F-count值约束步长导数程序03 0 0.11283 17 0.05033 9.714e-17 1 0.197局部最小可能值。约束满足。fminimax停止的原因是当前搜索方向的大小小于步长容差值的两倍,且约束条件满足于约束容差值之内。

检查最接近的整数值

看看附近的值是否能产生更好的过滤器。

xold = x;xmask = 1:2 * n;xmask([n+1, mix]) = [];x = x + 0。5;i = xmask [x, xmask] = elimone(x, xmask, h, w, n, maxbin);结束xmask = 1:2 * n;xmask([n+1, mix]) = [];x = x - 0.5;i = xmask [x, xmask] = elimone(x, xmask, h, w, n, maxbin);结束如果任意(abs(x) > maxbin) x = xold;结束

频率响应的比较

我们首先画出滤波器的频率响应然后将其与系数四舍五入的滤波器进行比较:

subplot(211) bo = x(1:n);ao = x (n + 1:2 * n);h2 = abs (freqz (bo, ao, 128));情节(w h, w, h2,“o”)标题(“优化滤镜与原始滤镜”圆(圆圆的)
xround =1×812 2 1 57 -127 108 -34
b = xround (1: n);一个= xround (n + 1:2 * n);h3 = abs (freqz (b, a, 128));次要情节(212)情节(w h, w, h3,“+”)标题(“圆角滤镜与原始滤镜”)

无花果= gcf;fig.NextPlot =“替换”;

另请参阅

相关的话题