n = 20;
lambda = 1;
d = 0.45*lambda;
theta_pass = 40;
theta_stop = 50;
ripple = 0.1;
m = 30*n;
omega_zero = -2*pi*d/lambda;
omega_pass = -2*pi*d/lambda*cos(theta_pass*pi/180);
omega_stop = -2*pi*d/lambda*cos(theta_stop*pi/180);
omega_pi = +2*pi*d/lambda;
omega = linspace(-pi,pi,m)';
A = exp( -j*omega(:)*[1-n:n-1] );
Ap = A(omega >= omega_zero & omega <= omega_pass,:);
As = A(omega >= omega_stop & omega <= omega_pi,:);
cvx_begin
variable r(2*n-1,1) complex
minimize( max( real( As*r ) ) )
subject to
(10^(-ripple/20))^2 <= real( Ap*r ) <= (10^(+ripple/20))^2;
real( A*r ) >= 0;
imag(r(n)) == 0;
r(n-1:-1:1) == conj(r(n+1:end));
cvx_end
if ~strfind(cvx_status,'Solved')
return
end
w = spectral_fact(r);
min_sidelobe_level = 10*log10( cvx_optval );
fprintf(1,'The minimum sidelobe level is %3.2f dB.\n\n',...
min_sidelobe_level);
theta = [-180:180]';
G = kron( cos(pi*theta/180), [0:n-1] );
G = exp(2*pi*i*d/lambda*G);
y = G*w;
figure(1), clf
ymin = -40; ymax = 5;
plot([-180:180], 20*log10(abs(y)), ...
[theta_stop theta_stop],[ymin ymax],'r--',...
[-theta_pass -theta_pass],[ymin ymax],'r--',...
[-theta_stop -theta_stop],[ymin ymax],'r--',...
[theta_pass theta_pass],[ymin ymax],'r--');
xlabel('look angle'), ylabel('mag y(theta) in dB');
axis([-180 180 ymin ymax]);
figure(2), clf
zerodB = 50;
dBY = 20*log10(abs(y)) + zerodB;
plot(dBY.*cos(pi*theta/180), dBY.*sin(pi*theta/180), '-');
axis([-zerodB zerodB -zerodB zerodB]), axis('off'), axis('square')
hold on
plot(zerodB*cos(pi*theta/180),zerodB*sin(pi*theta/180),'k:')
plot( (min_sidelobe_level + zerodB)*cos(pi*theta/180), ...
(min_sidelobe_level + zerodB)*sin(pi*theta/180),'k:')
text(-zerodB,0,'0 dB')
text(-(min_sidelobe_level + zerodB),0,sprintf('%0.1f dB',min_sidelobe_level));
plot([0 60*cos(theta_pass*pi/180)], [0 60*sin(theta_pass*pi/180)], 'k:')
plot([0 60*cos(-theta_pass*pi/180)],[0 60*sin(-theta_pass*pi/180)],'k:')
plot([0 60*cos(theta_stop*pi/180)], [0 60*sin(theta_stop*pi/180)], 'k:')
plot([0 60*cos(-theta_stop*pi/180)],[0 60*sin(-theta_stop*pi/180)],'k:')
hold off
Calling Mosek 9.1.9: 1171 variables, 40 equality constraints
For improved efficiency, Mosek is solving the dual problem.
------------------------------------------------------------
MOSEK Version 9.1.9 (Build date: 2019-11-21 11:32:15)
Copyright (c) MOSEK ApS, Denmark. WWW: mosek.com
Platform: MACOSX/64-X86
MOSEK warning 710: #19 (nearly) zero elements are specified in sparse col '' (571) of matrix 'A'.
MOSEK warning 710: #19 (nearly) zero elements are specified in sparse col '' (1170) of matrix 'A'.
Problem
Name :
Objective sense : min
Type : LO (linear optimization problem)
Constraints : 40
Cones : 0
Scalar variables : 1171
Matrix variables : 0
Integer variables : 0
Optimizer started.
Presolve started.
Linear dependency checker started.
Linear dependency checker terminated.
Eliminator started.
Freed constraints in eliminator : 0
Eliminator terminated.
Eliminator - tries : 1 time : 0.00
Lin. dep. - tries : 1 time : 0.00
Lin. dep. - number : 0
Presolve terminated. Time: 0.01
Problem
Name :
Objective sense : min
Type : LO (linear optimization problem)
Constraints : 40
Cones : 0
Scalar variables : 1171
Matrix variables : 0
Integer variables : 0
Optimizer - threads : 8
Optimizer - solved problem : the primal
Optimizer - Constraints : 40
Optimizer - Cones : 0
Optimizer - Scalar variables : 1106 conic : 0
Optimizer - Semi-definite variables: 0 scalarized : 0
Factor - setup time : 0.00 dense det. time : 0.00
Factor - ML order time : 0.00 GP order time : 0.00
Factor - nonzeros before factor : 820 after factor : 820
Factor - dense dim. : 0 flops : 1.68e+06
ITE PFEAS DFEAS GFEAS PRSTATUS POBJ DOBJ MU TIME
0 8.9e+02 4.0e+00 7.9e+00 0.00e+00 2.947569365e+00 0.000000000e+00 4.0e+00 0.01
1 1.2e+02 5.5e-01 1.1e+00 2.71e+00 -1.529008670e-01 -2.384358179e-01 5.5e-01 0.02
2 4.9e+01 2.2e-01 4.4e-01 3.97e+00 -4.425618567e-02 -5.651547334e-02 2.2e-01 0.02
3 2.1e+01 9.5e-02 2.0e-01 2.18e+00 -1.331325515e-02 -1.707565750e-02 9.6e-02 0.02
4 1.1e+01 4.9e-02 1.0e-01 1.41e+00 -6.910651456e-03 -8.672733903e-03 4.9e-02 0.02
5 4.0e+00 1.8e-02 3.8e-02 1.21e+00 -4.094147002e-03 -4.716241084e-03 1.8e-02 0.03
6 2.1e+00 9.3e-03 1.9e-02 1.00e+00 -3.687505923e-03 -4.013387222e-03 9.4e-03 0.03
7 8.6e-01 3.9e-03 8.0e-03 9.67e-01 -3.495981730e-03 -3.632753953e-03 3.9e-03 0.03
8 4.4e-02 2.0e-04 4.1e-04 1.01e+00 -3.432986425e-03 -3.439912616e-03 2.0e-04 0.03
9 1.3e-02 6.0e-05 1.2e-04 9.94e-01 -3.429045476e-03 -3.431146180e-03 6.1e-05 0.03
10 1.3e-03 5.8e-06 1.2e-05 1.00e+00 -3.427957151e-03 -3.428160194e-03 5.9e-06 0.03
11 2.7e-05 1.2e-07 2.5e-07 1.00e+00 -3.428141962e-03 -3.428146250e-03 1.2e-07 0.04
12 2.7e-09 1.2e-11 2.6e-11 1.00e+00 -3.428146796e-03 -3.428146797e-03 1.3e-11 0.04
Basis identification started.
Primal basis identification phase started.
Primal basis identification phase terminated. Time: 0.00
Dual basis identification phase started.
Dual basis identification phase terminated. Time: 0.00
Basis identification terminated. Time: 0.00
Optimizer terminated. Time: 0.05
Interior-point solution summary
Problem status : PRIMAL_AND_DUAL_FEASIBLE
Solution status : OPTIMAL
Primal. obj: -3.4281467964e-03 nrm: 1e+00 Viol. con: 5e-11 var: 0e+00
Dual. obj: -3.4281467968e-03 nrm: 1e+00 Viol. con: 0e+00 var: 3e-15
Basic solution summary
Problem status : PRIMAL_AND_DUAL_FEASIBLE
Solution status : OPTIMAL
Primal. obj: -3.4281467969e-03 nrm: 1e+00 Viol. con: 8e-16 var: 0e+00
Dual. obj: -3.4281467968e-03 nrm: 1e+00 Viol. con: 0e+00 var: 1e-13
Optimizer summary
Optimizer - time: 0.05
Interior-point - iterations : 12 time: 0.04
Basis identification - time: 0.00
Primal - iterations : 0 time: 0.00
Dual - iterations : 0 time: 0.00
Clean primal - iterations : 0 time: 0.00
Clean dual - iterations : 0 time: 0.00
Simplex - time: 0.00
Primal simplex - iterations : 0 time: 0.00
Dual simplex - iterations : 0 time: 0.00
Mixed integer - relaxations: 0 time: 0.00
------------------------------------------------------------
Status: Solved
Optimal value (cvx_optval): +0.00342815
The minimum sidelobe level is -24.65 dB.