74 lines
1.8 KiB
Matlab
74 lines
1.8 KiB
Matlab
function [w_hybrid, F_RF] = algo_hybrid_robust_omp(w_opt, A_dic, N_RF, a_target, R)
|
||
|
||
% 输入:
|
||
% w_opt:理想数字波束(MVDR结果)
|
||
% A_dic:字典
|
||
% N_RF:RF链数
|
||
|
||
[N, ~] = size(A_dic);
|
||
|
||
residual = w_opt; % 初始残差
|
||
selected_index = []; % 已选原子
|
||
lambda = 0.01; % 正则化参数(关键)
|
||
|
||
max_iter = N_RF;
|
||
|
||
for iter = 1:max_iter
|
||
|
||
% =========================
|
||
% Step1:相关性计算
|
||
% =========================
|
||
corr = abs(A_dic' * residual);
|
||
|
||
% 找Top-2(而不是Top-1)
|
||
[~, idx_sorted] = sort(corr, 'descend');
|
||
new_idx = idx_sorted(1:2);
|
||
|
||
% 合并索引(避免重复)
|
||
selected_index = unique([selected_index new_idx']);
|
||
|
||
% =========================
|
||
% Step2:构造子字典
|
||
% =========================
|
||
A_selected = A_dic(:, selected_index);
|
||
|
||
% =========================
|
||
% Step3:正则化最小二乘(核心改进)
|
||
% =========================
|
||
x = (A_selected' * A_selected + lambda * eye(length(selected_index))) \ ...
|
||
(A_selected' * w_opt);
|
||
|
||
% =========================
|
||
% Step4:更新残差
|
||
% =========================
|
||
residual = w_opt - A_selected * x;
|
||
|
||
% =========================
|
||
% Step5:提前停止(关键!)
|
||
% =========================
|
||
if norm(residual) < 1e-3
|
||
break;
|
||
end
|
||
|
||
end
|
||
|
||
% =========================
|
||
% 构造RF矩阵
|
||
% =========================
|
||
F_RF = A_dic(:, selected_index);
|
||
|
||
% 模拟约束(只保留相位)
|
||
F_RF = exp(1j * angle(F_RF));
|
||
|
||
% =========================
|
||
% 数字基带优化
|
||
% =========================
|
||
F_BB = pinv(F_RF) * w_opt;
|
||
|
||
% 最终波束
|
||
w_hybrid = F_RF * F_BB;
|
||
|
||
% 归一化
|
||
w_hybrid = w_hybrid / norm(w_hybrid);
|
||
|
||
end |