ARRAY_GEOMETRY = '2D_UNIFORM_LATTICE';
P = 2;
fs = 8000;
T = 1/fs;
c = 2000;
theta_tar = 70;
half_beamwidth = 10;
f_low = 1500;
f_high = 2000;
if strcmp( ARRAY_GEOMETRY, '2D_RANDOM' )
rand('state',0);
n = 20;
L = 0.45*(c/f_high)*sqrt(n);
loc = L*rand(n,2);
elseif strcmp( ARRAY_GEOMETRY, '2D_UNIFORM_LATTICE' )
m = 6; n = m^2;
d = 0.45*(c/f_high);
loc = zeros(n,2);
for x = 0:m-1
for y = 0:m-1
loc(m*y+x+1,:) = [x y];
end
end
loc = loc*d;
else
error('Undefined array geometry')
end
numtheta = 180;
numfreqs = 6;
theta = linspace(1,360,numtheta)';
freqs = linspace(500,3000,numfreqs)';
clear Atotal;
for k = 1:numfreqs
Afir = kron( ones(numtheta,n), -[0:P-1]/fs );
Alocx = kron( loc(:,1)', ones(1,P) );
Alocy = kron( loc(:,2)', ones(1,P) );
Aloc = kron( cos(pi*theta/180)/c, Alocx ) + kron( sin(pi*theta/180)/c, Alocy );
Atotal(:,:,k) = exp(2*pi*i*freqs(k)*(Afir+Aloc));
end
inbandInd = find( freqs >= f_low & freqs <= f_high );
outbandInd = find( freqs < f_low | freqs > f_high );
thetaStopInd = find( theta > (theta_tar+half_beamwidth) | ...
theta < (theta_tar-half_beamwidth) );
[diffClosest, thetaTarInd] = min( abs(theta - theta_tar) );
Atar = []; As = [];
for k = [inbandInd]'
Atar = [Atar; Atotal(thetaTarInd,:,k)];
As = [As; Atotal(thetaStopInd,:,k)];
end
for k = [outbandInd]'
As = [As; Atotal(:,:,k)];
end
cvx_begin
variable w(n*P) complex
minimize( max( abs( As*w ) ) )
subject to
Atar*w == 1;
cvx_end
disp(['Problem is ' cvx_status])
if ~strfind(cvx_status,'Solved')
return
end
fprintf(1,'The minimum sidelobe level is %3.2f dB.\n\n',...
20*log10(cvx_optval) );
figure(1); clf;
plot(loc(:,1),loc(:,2),'o')
title('Antenna locations')
axis('square')
figure(2); clf;
clr = { 'r' 'r' 'b' 'b' 'r' 'r' };
linetype = {'--' '--' '-' '-' '--' '--'};
for k = 1:numfreqs
plot(theta, 20*log10(abs(Atotal(:,:,k)*w)), [clr{k} linetype{k}]);
hold on;
end
axis([1 360 -15 0])
title('Passband (blue solid curves) and stopband (red dashed curves)')
xlabel('look angle'), ylabel('abs(y) in dB');
hold off;
figure(3); clf;
bw = 2*half_beamwidth;
subplot(2,2,1); polar_plot_ant(abs( Atotal(:,:,2)*w ),theta_tar,bw,'f = 1000 (stop)');
subplot(2,2,2); polar_plot_ant(abs( Atotal(:,:,3)*w ),theta_tar,bw,'f = 1500 (pass)');
subplot(2,2,3); polar_plot_ant(abs( Atotal(:,:,4)*w ),theta_tar,bw,'f = 2000 (pass)');
subplot(2,2,4); polar_plot_ant(abs( Atotal(:,:,5)*w ),theta_tar,bw,'f = 2500 (stop)');
Calling sedumi: 4244 variables, 1205 equality constraints
For improved efficiency, sedumi is solving the dual problem.
------------------------------------------------------------
SeDuMi 1.21 by AdvOL, 2005-2008 and Jos F. Sturm, 1998-2003.
Alg = 2: xz-corrector, Adaptive Step-Differentiation, theta = 0.250, beta = 0.500
Put 4 free variables in a quadratic cone
eqs m = 1205, order n = 3183, dim = 4246, blocks = 1062
nnz(A) = 306442 + 0, nnz(ADA) = 329485, nnz(L) = 165345
it : b*y gap delta rate t/tP* t/tD* feas cg cg prec
0 : 7.09E+02 0.000
1 : -1.89E+00 3.15E+02 0.000 0.4447 0.9000 0.9000 2.07 1 1 9.4E+02
2 : -3.26E+00 6.85E+01 0.000 0.2175 0.9000 0.9000 0.51 1 1 2.2E+02
3 : -9.70E-01 2.46E+01 0.000 0.3591 0.9000 0.9000 4.65 1 1 2.2E+01
4 : -7.69E-01 1.66E+01 0.000 0.6743 0.9000 0.9000 2.62 1 1 1.2E+01
5 : -7.23E-01 1.05E+01 0.000 0.6338 0.9000 0.9000 1.48 1 1 6.9E+00
6 : -6.27E-01 4.82E+00 0.000 0.4585 0.9000 0.9000 1.43 1 1 2.7E+00
7 : -5.68E-01 2.53E+00 0.000 0.5251 0.9000 0.9000 1.30 1 1 1.3E+00
8 : -5.40E-01 1.41E+00 0.000 0.5555 0.9000 0.9000 1.18 1 1 6.9E-01
9 : -5.19E-01 7.73E-01 0.000 0.5497 0.9000 0.9000 1.12 1 1 3.7E-01
10 : -5.06E-01 3.86E-01 0.000 0.4997 0.9000 0.9000 1.06 1 1 1.8E-01
11 : -4.98E-01 1.66E-01 0.000 0.4305 0.9000 0.9000 1.02 1 1 7.8E-02
12 : -4.95E-01 7.49E-02 0.000 0.4506 0.9019 0.9000 1.00 1 1 3.5E-02
13 : -4.93E-01 2.69E-02 0.000 0.3588 0.9123 0.9000 0.99 1 1 1.3E-02
14 : -4.92E-01 1.21E-02 0.000 0.4512 0.9000 0.7400 0.99 1 1 5.8E-03
15 : -4.92E-01 5.03E-03 0.000 0.4148 0.9015 0.9000 0.99 1 1 2.4E-03
16 : -4.92E-01 2.17E-03 0.000 0.4310 0.9014 0.9000 1.00 1 1 1.0E-03
17 : -4.92E-01 9.67E-04 0.000 0.4457 0.9000 0.6760 0.98 2 1 4.7E-04
18 : -4.92E-01 3.29E-04 0.000 0.3399 0.9187 0.9000 1.00 2 2 1.6E-04
19 : -4.92E-01 1.40E-04 0.000 0.4273 0.9000 0.9026 0.99 3 1 6.9E-05
20 : -4.92E-01 5.18E-05 0.000 0.3692 0.9000 0.8820 1.02 6 9 2.5E-05
21 : -4.92E-01 1.45E-05 0.000 0.2793 0.9032 0.9000 0.99 17 24 7.1E-06
22 : -4.92E-01 3.86E-06 0.000 0.2665 0.9054 0.9000 0.99 34 42 1.9E-06
23 : -4.92E-01 7.66E-07 0.000 0.1984 0.9045 0.9000 0.98 41 52 3.9E-07
24 : -4.92E-01 4.33E-08 0.000 0.0565 0.9900 0.9900 1.01 37 80 2.1E-08
25 : -4.92E-01 2.98E-08 0.000 0.6893 0.9000 0.0000 0.99 99 99 1.0E-08
iter seconds digits c*x b*y
25 21.7 8.4 -4.9187930424e-01 -4.9187930617e-01
|Ax-b| = 1.3e-08, [Ay-c]_+ = 7.0E-11, |x|= 9.2e-01, |y|= 7.4e+00
Detailed timing (sec)
Pre IPM Post
8.500E-01 2.168E+01 4.000E-02
Max-norms: ||b||=1, ||c|| = 1,
Cholesky |add|=71, |skip| = 2, ||L.L|| = 5026.63.
------------------------------------------------------------
Status: Solved
Optimal value (cvx_optval): +0.491879
Problem is Solved
The minimum sidelobe level is -6.16 dB.