minimax 优化
此示例说明如何在 Optimization Toolbox™ 中使用 minimax 优化算法 fminimax
求解非线性滤波器设计问题。请注意,要运行此示例,您必须先安装 Signal Processing Toolbox™。
设置有限精度参数
假设有一个有限精度滤波器的设计示例。为此,您不仅需要指定滤波器设计参数(如截止频率和系数个数),还需要指定可用的位数(因为设计采用的是有限精度)。
nbits = 8; % How many bits have we to realize filter maxbin = 2^nbits-1; % Maximum number expressable in nbits bits n = 4; % Number of coefficients (order of filter plus 1) Wn = 0.2; % Cutoff frequency for filter Rp = 1.5; % Decibels of ripple in the passband w = 128; % Number of frequency points to take
先进行连续设计
这是一种连续滤波器设计;我们使用 cheby1
,但我们也可以在此处使用 ellip
、yulewalk
或 remez
:
[b1,a1] = cheby1(n-1,Rp,Wn); [h,w] = freqz(b1,a1,w); % Frequency response h = abs(h); % Magnitude response plot(w, h) title('Frequency response using non-integer variables')
x = [b1,a1]; % The design variables
设置滤波器系数的边界
我们现在来设置最大值和最小值的边界:
if (any(x < 0)) % If there are negative coefficients - must save room to use a sign bit % and therefore reduce maxbin maxbin = floor(maxbin/2); vlb = -maxbin * ones(1, 2*n)-1; vub = maxbin * ones(1, 2*n); else % otherwise, all positive vlb = zeros(1,2*n); vub = maxbin * ones(1, 2*n); end
缩放系数
将最大值设置为等于 maxbin,并适当缩放其他滤波器系数。
[m, mix] = max(abs(x)); factor = maxbin/m; x = factor * x; % Rescale other filter coefficients xorig = x; xmask = 1:2*n; % Remove the biggest value and the element that controls D.C. Gain % from the list of values that can be changed. xmask(mix) = []; nx = 2*n;
设置优化条件
使用 optimoptions
,将终止条件调整到合理的高值,以缩短运行时间。同时打开每次迭代的结果显示:
options = optimoptions('fminimax', ... 'StepTolerance', 0.1, ... 'OptimalityTolerance', 1e-4,... 'ConstraintTolerance', 1e-6, ... 'Display', 'iter');
最小化绝对最大值
我们需要最小化绝对最大值,因此我们将 options.MinAbsMax 设置为频率点的数量:
if length(w) == 1 options = optimoptions(options,'AbsoluteMaxObjectiveCount',w); else options = optimoptions(options,'AbsoluteMaxObjectiveCount',length(w)); end
去除第一个值以进行优化
离散化并去除第一个值,然后通过调用 FMINIMAX 执行优化:
[x, xmask] = elimone(x, xmask, h, w, n, maxbin)
x = 1×8
0.5441 1.6323 1.6323 0.5441 57.1653 -127.0000 108.0000 -33.8267
xmask = 1×6
1 2 3 4 5 8
niters = length(xmask);
disp(sprintf('Performing %g stages of optimization.\n\n', niters));
Performing 6 stages of optimization.
for m = 1:niters fun = @(xfree)filtobj(xfree,x,xmask,n,h,maxbin); % objective confun = @(xfree)filtcon(xfree,x,xmask,n,h,maxbin); % nonlinear constraint disp(sprintf('Stage: %g \n', m)); x(xmask) = fminimax(fun,x(xmask),[],[],[],[],vlb(xmask),vub(xmask),... confun,options); [x, xmask] = elimone(x, xmask, h, w, n, maxbin); end
Stage: 1
Objective Max Line search Directional Iter F-count value constraint steplength derivative Procedure 0 8 0 0.00329174 1 17 0.0001845 3.34e-07 1 0.0143 Local minimum possible. Constraints satisfied. fminimax stopped because the size of the current search direction is less than twice the value of the step size tolerance and constraints are satisfied to within the value of the constraint tolerance.
Stage: 2
Objective Max Line search Directional Iter F-count value constraint steplength derivative Procedure 0 7 0 0.0414182 1 15 0.01649 0.0002558 1 0.261 2 23 0.01544 6.126e-07 1 -0.0282 Hessian modified Local minimum possible. Constraints satisfied. fminimax stopped because the size of the current search direction is less than twice the value of the step size tolerance and constraints are satisfied to within the value of the constraint tolerance.
Stage: 3
Objective Max Line search Directional Iter F-count value constraint steplength derivative Procedure 0 6 0 0.0716961 1 13 0.05943 -1.156e-11 1 0.776 Local minimum possible. Constraints satisfied. fminimax stopped because the size of the current search direction is less than twice the value of the step size tolerance and constraints are satisfied to within the value of the constraint tolerance.
Stage: 4
Objective Max Line search Directional Iter F-count value constraint steplength derivative Procedure 0 5 0 0.129938 1 11 0.04278 2.937e-10 1 0.183 Local minimum possible. Constraints satisfied. fminimax stopped because the size of the current search direction is less than twice the value of the step size tolerance and constraints are satisfied to within the value of the constraint tolerance.
Stage: 5
Objective Max Line search Directional Iter F-count value constraint steplength derivative Procedure 0 4 0 0.0901749 1 9 0.03867 -4.951e-11 1 0.256 Local minimum possible. Constraints satisfied. fminimax stopped because the size of the current search direction is less than twice the value of the step size tolerance and constraints are satisfied to within the value of the constraint tolerance.
Stage: 6
Objective Max Line search Directional Iter F-count value constraint steplength derivative Procedure 0 3 0 0.11283 1 7 0.05033 -1.249e-16 1 0.197 Local minimum possible. Constraints satisfied. fminimax stopped because the size of the current search direction is less than twice the value of the step size tolerance and constraints are satisfied to within the value of the constraint tolerance.
检查最接近的整数值
看看附近的值是否能生成更好的滤波器。
xold = x; xmask = 1:2*n; xmask([n+1, mix]) = []; x = x + 0.5; for i = xmask [x, xmask] = elimone(x, xmask, h, w, n, maxbin); end xmask = 1:2*n; xmask([n+1, mix]) = []; x = x - 0.5; for i = xmask [x, xmask] = elimone(x, xmask, h, w, n, maxbin); end if any(abs(x) > maxbin) x = xold; end
频率响应比较
首先绘制滤波器的频率响应,并将其与系数向上或向下舍入的滤波器进行比较:
subplot(211) bo = x(1:n); ao = x(n+1:2*n); h2 = abs(freqz(bo,ao,128)); plot(w,h,w,h2,'o') title('Optimized filter versus original') xround = round(xorig)
xround = 1×8
1 2 2 1 57 -127 108 -34
b = xround(1:n); a = xround(n+1:2*n); h3 = abs(freqz(b,a,128)); subplot(212) plot(w,h,w,h3,'+') title('Rounded filter versus original')
fig = gcf;
fig.NextPlot = 'replace';