主要内容

极大极小优化

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

设置有限精度参数

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

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

连续设计第一

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

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

Figure包含一个轴对象。使用非整型变量的频率响应轴对象包含一个类型为line的对象。

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

设置过滤系数的边界

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

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

比例系数

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

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

设置优化标准

使用optimoptions,将终止准则调整到较高的值,以缩短运行时间。同时在每次迭代时打开结果显示:

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

最小化绝对最大值

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

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

消除第一个优化值

将第一个值离散并消除,通过调用FMINIMAX进行优化:

[x, xmask] = 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 (执行各个阶段的优化。硝酸钠));
执行6个阶段的优化。
M = 1:niters fun = @(xfree)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选项);[x, xmask] = 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.124e-07 1 -0.0282 Hessian修正局部最小可能值。约束满足。由于当前搜索方向的大小小于步长公差值的两倍,且约束条件满足在约束公差值之内,因此Fminimax停止。
第三阶段:
目的最大行搜索定向Iter F-count值约束步长导数过程0 6 0 0.0716961 1 13 0.05943 2.787e-11 1 0.776局部最小可能值。约束满足。由于当前搜索方向的大小小于步长公差值的两倍,且约束条件满足在约束公差值之内,因此Fminimax停止。
第四阶段:
目的最大行搜索定向Iter F-count值约束步长导数过程0 5 0 0.129938 1 11 0.04278 2.835e-11 1 0.183可能的局部最小值。约束满足。由于当前搜索方向的大小小于步长公差值的两倍,且约束条件满足在约束公差值之内,因此Fminimax停止。
第五阶段:
目的最大行搜索定向Iter F-count值约束步长导数过程0 4 0 0.0901749 1 9 0.03867 -1.671e-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);结束如果if (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 = xorig
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,“+”)标题(“圆角滤镜与原始滤镜”

图中包含2个轴对象。轴对象1与标题优化过滤器与原始包含2个类型为line的对象。轴对象2与标题圆角过滤器与原始包含2个类型线的对象。

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

另请参阅

相关的话题