极大极小优化
这个例子展示了如何用极大极小优化算法解决一个非线性滤波器设计问题,fminimax
,在优化工具箱™中。注意,要运行此示例,必须安装信号处理工具箱™。
设定有限精度参数
考虑一个有限精度滤波器设计的例子。为此,您不仅需要指定滤波器设计参数,如截止频率和系数数量,而且还需要指定可用的位数,因为设计的精度是有限的。
Nbits = 8;我们需要多少位来实现滤波器Maxbin = 2^nbits-1;可用nbits表示的最大数目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 = floor(Maxbin /2);VLB = -maxbin * ones(1,2 *n)-1;Vub = maxbin * ones(1,2 *n);其他的%否则,全部为正VLB = 0 (1,2*n);Vub = maxbin * ones(1,2 *n);结束
比例系数
设置最大值为maxbin,并适当缩放其他过滤器系数。
[m, mix] = max(abs(x));因子= maxbin/m;X =因子* X;重新缩放其他过滤器系数Xorig = x;Xmask = 1:2*n;移除最大的值和控制直流增益的元素%从可以更改的值列表中取出。Xmask (mix) = [];Nx = 2*n;
设置优化标准
使用optimoptions
,将终止准则调整到合理的高值,以缩短运行时间。还可以在每次迭代时打开结果显示:
选项= optimoptions(“fminimax”,...“StepTolerance”, 0.1,...“OptimalityTolerance”1的军医,...“ConstraintTolerance”1 e-6...“显示”,“通路”);
最小化绝对最大值
我们需要最小化绝对最大值,所以我们设置选项。MinAbsMax取频率点的个数:
如果长度(w) == 1 options = optimoptions(选项,“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
Niters = length(xmask);disp (sprintf ('正在执行%g个优化阶段。\n\n'硝酸钠));
执行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计数值约束步长导数程序0 8 0 0.00329174 1 17 0.0001845 3.34e-07 1 0.0143局部可能的最小值。约束满足。Fminimax停止,因为当前搜索方向的大小小于步长公差值的两倍,约束被满足到约束公差值之内。
阶段:2
目的最大行搜索方向Iter f计数值约束步长导数程序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计数值约束步长导数操作步骤0 6 0 0.0716961 1 13 0.05943 -1.156e-11 1 0.776局部最小可能值。约束满足。Fminimax停止,因为当前搜索方向的大小小于步长公差值的两倍,约束被满足到约束公差值之内。
第四阶段:
目的最大行搜索方向Iter f计数值约束步长导数操作步骤0 5 0 0.129938 1 11 0.04278 2.937e-10 1 0.183局部可能的最小值。约束满足。Fminimax停止,因为当前搜索方向的大小小于步长公差值的两倍,约束被满足到约束公差值之内。
第五阶段:
目的最大行搜索方向Iter f计数值约束步长导数操作步骤0 4 0 0.0901749 1 9 0.03867 -4.951e-11 1 0.256可能的局部最小值。约束满足。Fminimax停止,因为当前搜索方向的大小小于步长公差值的两倍,约束被满足到约束公差值之内。
第六阶段:
目的最大行搜索方向Iter f计数值约束步长导数操作步骤03 0 0.11283 1 7 0.05033 -1.249e-16 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 = round(xorig)
xround =1×812 2 1 57 -127 108 -34
B = xround(1:n);A = xround(n+1:2*n);H3 = abs(频率(b,a,128));次要情节(212)情节(w h, w, h3,“+”)标题(“圆角滤镜与原始滤镜”)
FIG = gcf;fig.NextPlot =“替换”;