探索基于自适应波束形成的主瓣抗干扰算法。在以下matlab代码的基础上进行改进:%% 多约束优化波束形成算法完整实现
clear all; close all; clc;
N = 16; % 阵元数量
d = 0.5; % 阵元间距(半波长)
theta_target = 20; % 目标角度(度)
theta_jammers = [-10, 60]; % 干扰角度(度)
delta = 1.2; % 白噪声增益约束阈值
noise_power = 1; % 噪声功率
SNR = 10; % 信噪比(dB)
INRs = [20, 30]; % 干扰干噪比(dB)
% 运行多约束优化算法
[w, output] = multiConstraintBeamformer(theta_target, theta_jammers, N, d, delta);
%% 结果可视化
theta_scan = -90:0.1:90;
pattern_dB = 20*log10(abs(output.pattern)/max(abs(output.pattern)));
% 方向图
figure('Position', [100, 100, 800, 600], 'Color', 'w');
plot(theta_scan, pattern_dB, 'b', 'LineWidth', 1.5);
hold on;
% 标记目标方向
plot([theta_target, theta_target], ylim, 'r--', 'LineWidth', 1.5);
text(theta_target+2, -5, '目标 (20°)', 'FontSize', 12, 'Color', 'r')
% 标记干扰方向
for j = 1:length(theta_jammers)
plot([theta_jammers(j), theta_jammers(j)], ylim, 'k--', 'LineWidth', 1.5);
text(theta_jammers(j)+2, -15 - j*5, ...
sprintf('干扰 %d° (%.1f dB)', theta_jammers(j), output.null_depths(j)), ...
'FontSize', 10);
end
grid on;
xlabel('角度 (度)', 'FontSize', 12);
ylabel('归一化增益 (dB)', 'FontSize', 12);
title('多约束优化波束形成方向图', 'FontSize', 14);
xlim([-90, 90]);
ylim([-80, 0]);
set(gca, 'FontSize', 11, 'GridAlpha', 0.3);
% 主瓣区域放大
figure('Position', [200, 200, 800, 400], 'Color', 'w');
plot(theta_scan, pattern_dB, 'b', 'LineWidth', 1.5);
hold on;
plot([theta_target, theta_target], ylim, 'r--', 'LineWidth', 1.5);
xlim([10, 30]);
ylim([-3, 0]);
grid on;
xlabel('角度 (度)', 'FontSize', 12);
ylabel('归一化增益 (dB)', 'FontSize', 12);
title('主瓣区域放大图', 'FontSize', 14);
set(gca, 'FontSize', 11, 'GridAlpha', 0.3);
% 权向量可视化
figure('Position', [300, 300, 800, 400], 'Color', 'w');
% 权向量幅度
subplot(1,2,1);
stem(0:N-1, abs(w), 'filled', 'b', 'LineWidth', 1.5);
title('权向量幅度分布');
xlabel('阵元序号');
ylabel('幅度');
grid on;
set(gca, 'FontSize', 11, 'GridAlpha', 0.3);
ylim([0, max(abs(w))*1.1]);
% 权向量相位
subplot(1,2,2);
stem(0:N-1, rad2deg(angle(w)), 'filled', 'r', 'LineWidth', 1.5);
title('权向量相位分布');
xlabel('阵元序号');
ylabel('相位 (度)');
grid on;
set(gca, 'FontSize', 11, 'GridAlpha', 0.3);
% 性能指标显示
fprintf('===== 多约束优化算法性能指标 =====\n');
fprintf('输出 SINR: %.2f dB\n', output.SINR);
fprintf('主瓣增益: %.2f dB\n', output.mainlobe_gain);
fprintf('白噪声增益 (WNG): %.2f dB\n', output.WNG);
fprintf('零陷深度:\n');
for j = 1:length(theta_jammers)
fprintf(' %d°方向: %.1f dB\n', theta_jammers(j), output.null_depths(j));
end
%% 多约束优化波束形成器函数
function [w, output] = multiConstraintBeamformer(theta_target, theta_jammers, N, d, delta)
% 多约束优化波束形成器
% 输入:
% theta_target: 目标角度(度)
% theta_jammers: 干扰角度向量(度)
% N: 阵元数
% d: 阵元间距(波长)
% delta: 白噪声增益约束阈值
% 输出:
% w: 最优权向量
% output: 性能指标
%% 导向矢量生成函数
steering_vec = @(theta) exp(1j*2*pi*d*(0:N-1)'*sind(theta));
%% 生成导向矢量
a_target = steering_vec(theta_target);
a_jammers = arrayfun(@(th) steering_vec(th), theta_jammers, 'UniformOutput', false);
%% 约束矩阵构建
% 等式约束: C'w = f
C = [a_target, horzcat(a_jammers{:})];
f = [1; zeros(length(theta_jammers), 1)]; % 目标增益1,干扰增益0
%% 伪逆法求解
% 最小二乘解: w = C * inv(C'C) * f
w = C * ((C' * C) \ f);
%% 白噪声增益约束处理
current_norm = norm(w);
if current_norm > sqrt(delta)
% 如果范数超过阈值,进行缩放
w = w * sqrt(delta) / current_norm;
end
%% 计算方向图
pattern = computeBeampattern(w, N, d);
%% 性能评估
[SINR, main_gain, null_depths] = evaluatePerformance(w, theta_target, theta_jammers, N, d);
output = struct(...
'pattern', pattern, ...
'SINR', SINR, ...
'mainlobe_gain', main_gain, ...
'null_depths', null_depths, ...
'WNG', 10*log10(1/norm(w)^2));
end
%% 方向图计算函数
function pattern = computeBeampattern(w, N, d)
theta_scan = -90:0.1:90;
pattern = zeros(size(theta_scan));
steering_vec = @(theta) exp(1j*2*pi*d*(0:N-1)'*sind(theta));
for idx = 1:length(theta_scan)
a_theta = steering_vec(theta_scan(idx));
pattern(idx) = w' * a_theta;
end
end
%% 性能评估函数
function [SINR, main_gain, null_depths] = evaluatePerformance(w, theta_target, theta_jammers, N, d)
% 理论协方差矩阵参数
noise_power = 1;
SNR = 10; % dB
INRs = [20, 30]; % dB
target_power = noise_power * 10^(SNR/10);
jammer_powers = noise_power * 10.^(INRs/10);
% 导向矢量函数
steering_vec = @(theta) exp(1j*2*pi*d*(0:N-1)'*sind(theta));
% 目标方向导向矢量
a_target = steering_vec(theta_target);
% 干扰加噪声协方差矩阵
R_in = noise_power * eye(N);
for j = 1:length(theta_jammers)
a_jammer = steering_vec(theta_jammers(j));
R_in = R_in + jammer_powers(j) * (a_jammer * a_jammer');
end
% 信号功率
signal_power = abs(w' * a_target)^2 * target_power;
% 干扰加噪声功率
noise_power_out = real(w' * R_in * w);
% 输出SINR
SINR = 10*log10(signal_power / noise_power_out);
% 主瓣增益 (dB)
main_gain = 20*log10(abs(w' * a_target));
% 零陷深度 (dB)
null_depths = zeros(1, length(theta_jammers));
for j = 1:length(theta_jammers)
a_jammer = steering_vec(theta_jammers(j));
null_depths(j) = 20*log10(abs(w' * a_jammer));
end
end